Говоря в широком смысле, существует два подхода для вычисления разложения по собственным значениям или по сингулярным значениям. Один из подходов заключается в диагонализации матрицы, и это, по сути, приводит к одновременному получению всего разложения по собственным значениям / сингулярным значениям (всего спектра собственных значений), см. Краткий обзор здесь: Какие эффективные алгоритмы для вычисления разложения по сингулярным значениям (SVD)? Альтернативой является использование итерационного алгоритма, который выдает один (или несколько) собственных векторов за раз. Итерации могут быть остановлены после того, как желаемое количество собственных векторов было вычислено.
Я не думаю, что есть итерационные алгоритмы специально для SVD. Это связано с тем, что можно вычислить SVD матрицы B размером , выполнив собственное разложение квадратной симметричной ( n + m ) × ( n + m ) матрицы A = ( 0 B B ⊤ 0 ) . Поэтому вместо того , чтобы спросить , что алгоритмы вычисления усеченного СВД, вы должны спросить , что итерационный алгоритм вычислений eigendecomposition: алгоритм усеченного СВД ≈ итерационный алгоритм eigendecomposition .н × мВ( n + m ) × ( n + m )
A = ( 0В⊤В0) .
Алгоритм усеченных СВДА ≈ итерационного алгоритма eigendecomposition .
Самый простой итерационный алгоритм называется степенной итерацией и действительно очень прост:
- Инициализировать случайный .Икс
- Обновить .х ← А х
- Нормализовать .Икс ← х / ∥ х ∥
- Перейти к шагу № 2, если не сходятся.
Все более сложные алгоритмы в конечном счете основаны на идее мощной итерации, но становятся довольно сложными. Необходимая математика задается подпространствами Крылова . Алгоритмы - итерация Арнольди (для квадратных несимметричных матриц), итерация Ланцоша (для квадратных симметричных матриц) и их варианты, такие как, например, «неявно перезапущенный метод Ланцоша» и еще много чего.
Вы можете найти это, например, в следующих учебниках:
- Голуб и Ван Лоан, Матричные вычисления
- Trefethen & Bau, Численная линейная алгебра
- Деммель, Прикладная числовая линейная алгебра
- Саад, Численные методы для задач больших собственных значений
Все разумные языки программирования и пакеты статистики (Matlab, R, Python numpy, как вы его называете) используют одни и те же библиотеки Фортрана для выполнения разложения по собственным / сингулярным значениям. Это LAPACK и ARPACK . ARPACK означает ARnoldi PACKage, и это все об итерациях Арнольди / Ланцоша. Например, в Matlab есть две функции для SVD: svd
выполняет полную декомпозицию через LAPACK, и svds
вычисляет заданное число единичных векторов через ARPACK, и это на самом деле просто оболочка для eigs
вызова в матрице с квадратными размерами.
Обновить
ВAAВA
Для этих методов также есть библиотека Фортрана, она называется PROPACK :
Программный пакет PROPACK содержит набор функций для вычисления сингулярного разложения больших и разреженных или структурированных матриц. Процедуры SVD основаны на алгоритме бидиагонализации Ланцоша с частичной реортогонализацией (BPRO).
Тем не менее, PROPACK кажется гораздо менее стандартным, чем ARPACK, и изначально не поддерживается в стандартных языках программирования. Он написан Расмусом Ларсеном, у которого есть большая 90-страничная статья 1998 года « Бидиагонализация Ланцоша» с частичной реортогонализацией с хорошим обзором. Благодаря @MichaelGrant через этот поток вычислительной науки SE .
Среди более свежих работ наиболее популярными, по-видимому, являются Baglama & Reichel, 2005, Augmented неявно перезапускает методы бидиагонализации Lanczos , что, вероятно, соответствует уровню техники. Спасибо @Dougal за предоставленную ссылку в комментариях.
Обновление 2
Действительно, в обзорном документе, который вы сами цитировали, есть совершенно другой подход, описанный вами: Halko et al. 2009, Нахождение структуры со случайностью: вероятностные алгоритмы построения приближенных матричных разложений . Я не знаю достаточно об этом, чтобы комментировать.