Ganz allgemein gibt es zwei Ansätze zur Berechnung von Eigenwert- oder Singularwertzerlegungen. Ein Ansatz ist die Diagonalisierung der Matrix, die im Wesentlichen die gesamte Eigenwert- / Singulärwertzerlegung (das gesamte Eigenwertspektrum) zur gleichen Zeit ergibt. Sehen Sie hier eine Übersicht: Was sind effiziente Algorithmen zur Berechnung der Singulärwertzerlegung (SVD)? Die Alternative besteht darin, einen iterativen Algorithmus zu verwenden, der jeweils einen (oder mehrere) Eigenvektoren liefert. Iterationen können gestoppt werden, nachdem die gewünschte Anzahl von Eigenvektoren berechnet wurde.
Ich glaube nicht, dass es iterative Algorithmen speziell für SVD gibt. Dies liegt daran, dass man die SVD einer Matrix B berechnen kann, indem man eine neue Zerlegung einer quadratischen symmetrischen ( n + m ) × ( n + m ) -Matrix A = ( 0 B B ≤ 0 ) durchführt . Deshalb , anstatt zu fragen , was Algorithmen berechnen abgeschnittener SVD, sollten Sie fragen, was iterative Algorithmen berechnen Eigendekomposition: Algorithmus für abgeschnittenen SVD ≈ iterativen Algorithmus für Eigendekomposition .n × mB( n + m ) × ( n + m )
A = ( 0B⊤B0) .
Algorithmus für abgeschnittene SVD ≈ iterativer Algorithmus für eigendecomposition .
Der einfachste iterative Algorithmus heißt Power-Iteration und ist in der Tat sehr einfach:
- Initialisiere zufällig .x
- Aktualisiere .x ← A x
- Normalisiere .x ← x / ∥ x ∥
- Gehe zu Schritt 2, sofern nicht konvergiert.
All die komplexeren Algorithmen basieren letztendlich auf der Idee der Power-Iteration, sind jedoch recht komplex. Notwendige Mathematik wird von Krylov-Subspaces angegeben . Die Algorithmen sind Arnoldi-Iteration (für quadratische unsymmetrische Matrizen), Lanczos-Iteration (für quadratische symmetrische Matrizen) und Variationen davon, wie z. B. "implizit neu gestartete Lanczos-Methode" und so weiter.
Dies können Sie zB in folgenden Lehrbüchern nachlesen:
- Golub & Van Loan, Matrixberechnungen
- Trefethen & Bau, Numerische Lineare Algebra
- Demmel, Angewandte Numerische Lineare Algebra
- Saad, Numerische Methoden für große Eigenwertprobleme
Alle vernünftigen Programmiersprachen und Statistikpakete (Matlab, R, Python Numpy, wie Sie es nennen) verwenden die gleichen Fortran-Bibliotheken, um Eigen- / Singularwert-Zerlegungen durchzuführen. Dies sind LAPACK und ARPACK . ARPACK steht für ARnoldi PACKage und dreht sich alles um Arnoldi / Lanczos-Iterationen. In Matlab gibt es beispielsweise zwei Funktionen für SVD: Führt svd
eine vollständige Zerlegung über LAPACK durch und svds
berechnet eine bestimmte Anzahl von Singularvektoren über ARPACK. Dies ist eigentlich nur ein Wrapper für einen eigs
Aufruf auf der "quadratischen" Matrix.
Aktualisieren
BEINEINBEIN
Es gibt auch eine Fortran-Bibliothek für diese Methoden, die PROPACK heißt :
Das Softwarepaket PROPACK enthält eine Reihe von Funktionen zur Berechnung der Singulärwertzerlegung von großen und spärlichen oder strukturierten Matrizen. Die SVD-Routinen basieren auf dem Lanczos-Bidiagonalisierungsalgorithmus mit partieller Reorthogonalisierung (BPRO).
PROPACK scheint jedoch weitaus weniger Standard zu sein als ARPACK und wird von Haus aus in Standard-Programmiersprachen nicht unterstützt. Es wurde von Rasmus Larsen geschrieben, der 1998 eine große, 90 Seiten lange Lanczos-Bidiagonalisierung mit teilweiser Reorthogonalisierung mit scheinbar gutem Überblick veröffentlicht hat. Vielen Dank an @MichaelGrant über diesen Computational Science SE-Thread .
Unter den neueren Veröffentlichungen scheint Baglama & Reichel, 2005, Augmented, implizit neu gestartete Lanczos-Bidiagonalisierungsmethoden , die wahrscheinlich auf dem neuesten Stand der Technik sind , die populärste zu sein . Vielen Dank an @Dougal für diesen Link in den Kommentaren.
Update 2
In der Tat gibt es einen völlig anderen Ansatz, den Sie in dem von Ihnen zitierten Übersichtsartikel ausführlich beschrieben haben: Halko et al. 2009, Struktur mit Zufälligkeit finden: Probabilistische Algorithmen zur Konstruktion von approximativen Matrixzerlegungen . Ich weiß nicht genug darüber, um einen Kommentar abzugeben.