De façon très générale, il existe deux approches pour calculer les décompositions de valeurs propres ou de valeurs singulières. Une approche consiste à diagonaliser la matrice et cela donne essentiellement la décomposition entière des valeurs propres / valeurs singulières (l'ensemble du spectre des valeurs propres) en même temps, voir un aperçu ici: Quels sont les algorithmes efficaces pour calculer la décomposition des valeurs singulières (SVD)? L'alternative est d'utiliser un algorithme itératif qui produit un (ou plusieurs) vecteurs propres à la fois. Les itérations peuvent être arrêtées une fois que le nombre souhaité de vecteurs propres a été calculé.
n×mB(n+m)×(n+m)
A=(0B⊤B0).
algorithm for truncated SVD≈iterative algorithm for eigendecomposition.
L'algorithme itératif le plus simple est appelé itération de puissance et est en effet très simple:
- x
- x←Ax
- x←x/∥x∥
- Passez à l'étape # 2 sauf si vous avez convergé.
Tous les algorithmes les plus complexes sont finalement basés sur l'idée d'itération de puissance, mais deviennent assez sophistiqués. Les mathématiques nécessaires sont données par les sous-espaces de Krylov . Les algorithmes sont l' itération d'Arnoldi (pour les matrices non symétriques carrées), l' itération de Lanczos (pour les matrices symétriques carrées), et des variantes de celles-ci comme par exemple "la méthode Lanczos implicitement redémarrée" et ainsi de suite.
Vous pouvez trouver cela décrit par exemple dans les manuels suivants:
- Golub & Van Loan, calculs matriciels
- Trefethen & Bau, Algèbre linéaire numérique
- Demmel, Algèbre linéaire numérique appliquée
- Saad, Méthodes numériques pour les problèmes de grandes valeurs propres
Tous les langages de programmation et packages statistiques raisonnables (Matlab, R, Python numpy, vous l'appelez) utilisent les mêmes bibliothèques Fortran pour effectuer des décompositions de valeurs propres / singulières. Ce sont LAPACK et ARPACK . ARPACK signifie ARnoldi PACKage, et il s'agit d'itérations Arnoldi / Lanczos. Par exemple, dans Matlab, il existe deux fonctions pour SVD: svd
effectue une décomposition complète via LAPACK, et svds
calcule un nombre donné de vecteurs singuliers via ARPACK et il s'agit en fait juste d'un wrapper pour un eigs
appel sur la matrice "carrée".
Mise à jour
BAABA
Il existe également une bibliothèque Fortran pour ces méthodes, elle s'appelle PROPACK :
Le progiciel PROPACK contient un ensemble de fonctions pour calculer la décomposition en valeurs singulières de matrices grandes et clairsemées ou structurées. Les routines SVD sont basées sur l'algorithme de bidiagonalisation de Lanczos avec réorthogonalisation partielle (BPRO).
Cependant, PROPACK semble être beaucoup moins standard qu'ARPACK et n'est pas nativement pris en charge dans les langages de programmation standard. Il est écrit par Rasmus Larsen qui a une grande bidiagonalisation de Lanczos de 1998 de 90 pages avec une réorthogonalisation partielle avec ce qui semble un bon aperçu. Merci à @MichaelGrant via ce fil Computational Science SE .
Parmi les articles les plus récents, le plus populaire semble être Baglama & Reichel, 2005, Augmented a implicitement redémarré les méthodes de bidiagonalisation de Lanczos , ce qui correspond probablement à l'état de l'art. Merci à @Dougal d'avoir donné ce lien dans les commentaires.
Update 2
Il existe en effet une approche entièrement différente décrite en détail dans le document de synthèse que vous avez cité vous-même: Halko et al. 2009, Finding structure with randomness: Algorithmes probabilistes pour la construction de décompositions matricielles approximatives . Je n'en sais pas assez pour commenter.