Дуже широко кажучи, існує два підходи до обчислення власних значень чи сингулярних розкладів значення. Один із підходів - діагоналізація матриці, і це, по суті, дає одночасно ціле розкладання власного значення / сингулярного значення (весь спектр власного значення).Альтернативою є використання ітеративного алгоритму, який дає один (або кілька) власних векторів одночасно. Ітерації можна зупинити після обчислення потрібної кількості власних векторів.
Я не думаю, що є ітеративні алгоритми, спеціально для SVD. Це тому, що можна обчислити SVD матриці B , виконавши ейгендекомпозицію квадратної симетричної ( n + m ) × ( n + m ) матриці A = ( 0 B B ⊤ 0 ) .n×mB(n+m)×(n+m)
A=(0B⊤B0).
Тому замість того , щоб запитати , що алгоритми обчислення усіченого СВД, ви повинні запитати , що ітераційний алгоритм обчислень eigendecomposition:
algorithm for truncated SVD≈iterative algorithm for eigendecomposition.
Найпростіший ітеративний алгоритм називається ітерацією потужності і насправді дуже простий:
- x
- Оновлення x←Ax
- Нормалізувати x←x/∥x∥
- Перейдіть до кроку №2, якщо не зійдеться.
Всі більш складні алгоритми в кінцевому рахунку засновані на ідеї ітерації потужності, але отримують досить складний характер. Необхідну математику задає підпростори Крилова . Алгоритми - це ітерація Арнольді (для квадратних несиметричних матриць), ітерація Ланцоса (для квадратних симетричних матриць) та їх варіанти, такі як, наприклад, "неявно перезапущений метод Ланцоса" та ін.
Це можна знайти, наприклад, у наступних підручниках:
- Голуб і Ван Позика, Матричні обчислення
- Trefethen & Bau, Числова лінійна алгебра
- Деммель, Прикладна числова лінійна алгебра
- Саад, Числові методи для великих задач про власне значення
Усі розумні мови програмування та пакети статистики (Matlab, R, Python numpy, ви їх називаєте) використовують одні і ті ж бібліотеки Fortran для декомпозиції власних / сингулярних значень. Це LAPACK і ARPACK . ARPACK означає ARnoldi PACKage, і все стосується ітерацій Арнольді / Ланцоса. Наприклад, у Matlab є дві функції для SVD:svd
здійснює повне розкладання за допомогою LAPACK і svds
обчислює задану кількість сингулярних векторів через ARPACK, і це насправді просто обгортка для eigs
виклику на матриці "квадрат-іed".
Оновлення
BAABA і тим самим економити простір та час.
Для цих методів також існує бібліотека Fortran, вона називається PROPACK :
Програмний пакет PROPACK містить набір функцій для обчислення сингулярного розкладання великої великої та розрідженої або структурованої матриць. Процедури SVD засновані на алгоритмі бідіагоналізації Ланцоса з частковою реортогоналізацією (BPRO).
Однак здається, що PROPACK набагато менш стандартний, ніж ARPACK, і не підтримується в стандартних мовах програмування. Він написаний Расмусом Ларсеном, який має велику 90-сторінкову газету " Ланцос бідіагоналізація" з частковою реортогоналізацією, що здається хорошим оглядом. Завдяки @MichaelGrant через цю тему Computational Science SE .
Серед останніх робіт найбільш популярними видаються «Baglama & Reichel», 2005, « Augmented» неявно перезапущено методи бідіагоналізації Lanczos , що, мабуть, є у сучасному рівні. Дякуємо @Dougal за те, що дав це посилання у коментарях.
Оновлення 2
Насправді існує зовсім інший підхід, детально описаний у оглядовій роботі, яку ви цитували самі: Halko et al. 2009, Пошук структури з випадковістю: Імовірнісні алгоритми побудови наближених матричних декомпозицій . Я недостатньо знаю про це, щоб коментувати.