Supposons que j'ai une matrice dense de taille , avec décomposition SVDDans Je peux calculer la SVD comme suit: .
R
svd(A)
Si une nouvelle -ème ligne est ajoutée à , peut-on calculer la nouvelle décomposition SVD sur la base de l'ancienne (c'est-à-dire en utilisant , et ), sans recalculer SVD à partir de zéro?
algorithms
svd
linear-algebra
matrix-decomposition
numerics
user1436187
la source
la source
rank 1 updates
. Les révisions SVD en ligne rapides pour les systèmes de recommandation légers par marque sont un premier article accessible. Je n'ai pas vu quelque chose pour SVD déjà implémenté dans R malheureusement. Les mises à jour Cholesky existent (updown
depuisMatrix
) grâce à CHOLMOD. La rareté de votre matriceRéponses:
Oui, on peut mettre à jour une décomposition SVD après avoir ajouté une nouvelle ligne à la matrice existante.
En général, cette formulation de problème " ajouter un à " est connue sous le nom de mises à jour de rang un . Le lien MathOverflow fourni par @amoeba sur les « mises à jour efficaces de rang deux d'une décomposition de valeurs propres » est une excellente première étape si vous voulez commencer à approfondir la question; le premier article fournit une solution explicite à votre question spécifique. Juste pour clarifier ce que signifient le rang un et le rang deux afin que vous ne soyez pas confus, si votre nouveau est tel que:A∗
Où et v sont des vecteurs, vous vous référez à cela comme une mise à jour de premier rang (ou perturbation ). Les bases de cette mise à jour sont dictées par la formule Sherman-Morrison. . Si la perturbation est supérieure à un rang, c.-à-d. A ∗ = A - U V Tu v
la formule de Woodbury entre en jeu. Si vous voyez ces formules, vous remarquerez qu'il y a beaucoup d'inverse impliqué. Vous ne les résolvez pas directement. Comme vous avez déjà résolu une grande partie de leurs sous-systèmes (c'est-à-dire que vous avez déjà une décomposition calculée), vous les utilisez pour obtenir des estimations plus rapides et / ou plus stables. (C'est pourquoi les gens font encore des recherches dans ce domaine.) J'ai beaucoup utilisé le livre " Computational Statistics " de JE Gentle comme référence; Je pense que Chapt. 5 L'algèbre linéaire numérique vous configurera correctement. (L'Uber-classique: " Matrix Algebra From a Statistician's Perspective " de Harville ne porte malheureusement pas sur les mises à jour de classement.)
En ce qui concerne les statistiques / applications, les mises à jour de rang 1 sont courantes dans les systèmes de recommandation car on peut avoir des milliers d'entrées client et recalculer le SVD (ou toute décomposition donnée d'ailleurs) chaque fois qu'un nouvel utilisateur s'inscrit ou qu'un nouveau produit est ajouté ou supprimé est un gaspillage (sinon impossible). Les matrices système généralement recommandées sont rares et cela rend les algorithmes encore plus efficaces. Un premier article accessible est le manuscrit « Révisions SVD en ligne rapides pour les systèmes de recommandation légers » de M. Brand. En ce qui concerne les matrices denses, je pense que regarder les articles de Pattern Recognition and Imaging Processing peut vous aider à obtenir un algorithme réel à utiliser. Par exemple les papiers:
tous semblent s'attaquer au même problème dans leur cœur; de nouvelles fonctionnalités arrivent et nous devons mettre à jour notre représentation en conséquence rapidement . Notez que ces matrices ne sont pas symétriques ni même carrées. Un autre travail de M. Brand peut également résoudre ce problème (voir l'article " Modifications rapides de bas rang de la décomposition en valeurs singulières minces (2006) " - cela est également mentionné dans le lien MO donné au début de l'article). de nombreux articles sur le sujet, mais la plupart ont tendance à être fortement mathématiques (par exemple, l'article de Benaych-Georgesa et Nadakuditi sur « Les valeurs singulières et les vecteurs de perturbations de bas rang des grandes matrices aléatoires rectangulaires (2012)") et je ne pense pas qu'ils vous aideront à trouver une solution prochainement. Je vous suggère de vous concentrer sur la littérature sur le traitement d'images.
Malheureusement, je n'ai rencontré aucune implémentation R pour les routines de mise à jour de premier rang. La réponse « Mise en œuvre SVD actualisable en Python, C ou Fortran? » De Computational Science SE donne un certain nombre d'implémentations MATLAB et C ++ que vous voudrez peut-être envisager. Habituellement, l'implémentation R, Python, etc. sont des enveloppes autour des implémentations C, C ++ ou FORTRAN.
la source