Peut-être hors sujet ici, mais il existe déjà plusieurs ( une , deux ) questions liées.
En fouillant dans la littérature (ou une recherche google pour les algorithmes SVD tronqués), on trouve beaucoup d'articles qui utilisent les SVD tronqués de diverses manières et prétendent (frustrant, souvent sans citation) qu'il existe des algorithmes rapides pour le calculer, mais personne semble indiquer quels sont ces algorithmes.
La seule chose que je puisse trouver est un seul algorithme randomisé , utilisé dans la bibliothèque redSVD .
Ce que j'aimerais voir, c'est un ensemble d'algorithmes exacts et inexacts, adaptés pour comprendre comment les systèmes fonctionnent (mais pas nécessairement pour les implémenter, bien sûr!).
Quelqu'un at-il une bonne référence pour ce genre de chose?
la source
Réponses:
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é.
L'algorithme itératif le plus simple est appelé itération de puissance et est en effet très simple:
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:
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, etsvds
calcule un nombre donné de vecteurs singuliers via ARPACK et il s'agit en fait juste d'un wrapper pour uneigs
appel sur la matrice "carrée".Mise à jour
Il existe également une bibliothèque Fortran pour ces méthodes, elle s'appelle PROPACK :
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.
la source
Je suis juste tombé sur le fil via des SVD rapides sur Google, donc j'essaie de comprendre les choses moi-même, mais vous devriez peut-être vous pencher sur l' approximation croisée adaptative (ACA).
Encore une fois, cela dépend de votre problème si cela fonctionne. Dans de nombreux cas que je rencontre personnellement, l'ACA est un outil numérique très utile.
Remarque: je voulais écrire ceci en tant que commentaire, mais parce que je viens de créer ce compte, je n'ai pas assez de réputation pour les commentaires ... Mais la publication fonctionne.
la source
Voici une technique que j'ai utilisée avec succès dans le passé pour calculer un SVD tronqué (sur l'ensemble de données Netflix). Il est tiré de cet article . Dans un paramètre de filtrage collaboratif, je dois noter que la plupart des valeurs sont manquantes et le point est de les prédire , donc pour utiliser SVD tronqué pour résoudre un tel problème, vous devez utiliser une technique qui fonctionne dans cette condition. Une brève description:
la source