calculer la SVD tronquée, une valeur / vecteur singulier à la fois

11

Existe-t-il un algorithme SVD tronqué qui calcule les valeurs singulières une par une?

Mon problème: je voudrais calculer les premières valeurs singulières (et vecteurs singuliers) d'une grande matrice dense M , mais je ne sais pas ce que serait une valeur appropriée de k . M est grand, donc pour des raisons d'efficacité, je préfère ne pas évaluer le SVD complet uniquement pour tronquer les plus petits SV par la suite.kMkM

Idéalement, il y aurait un moyen de calculer les valeurs singulières série, de la plus grande ( σ 1 ) à la plus petite ( σ n ). De cette façon, je pourrais simplement arrêter le calcul après avoir calculé la k ème valeur singulière si σ k / σ 1 tombe en dessous d'un certain seuil.σ1,σ2,σ1σnkσk/σ1

Un tel algorithme existe-t-il (de préférence avec une implémentation Python)? Dans mes recherches, je n'ai trouvé que des fonctions SVD tronquées qui prennent k en paramètre, vous forçant ainsi à le deviner a priori.

SuperElectric
la source
Votre M est-il carré ou rectangulaire? Si rectangulaire, voulez-vous les vecteurs singuliers longs ou courts? Autrement dit, si M est (mxn) avec m> n, voulez-vous (mxk) ou (kxn)?
Max Hutchinson
M est rectangulaire, avec beaucoup plus de lignes que de colonnes. Je veux les vecteurs singuliers courts (c'est-à-dire V, dans M = U S V ^ T).
SuperElectric

Réponses:

6

Il y a quelques options disponibles si vous voulez une factorisation approximative de rang k.

  1. Factorisations QR très révélatrices de rang
  2. Décomposition interpolative (ID) et autres techniques randomisées.

UNE-MNTfacteur×σk+1(UNE): =ϵ

Une factorisation approximative de la forme ci-dessus peut être convertie en une décomposition standard comme QR ou SVD en utilisant des techniques standard. Une bonne revue est disponible dans l'article de Halko, Martinsson et Tropp "Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions"

ϵ

user2457602
la source
2

k

Si vous excluez l'approche du calcul de la SVD entière, les algorithmes de SVD partiels se réduisent à l'utilisation de méthodes itératives pour résoudre un problème de valeur propre hermitien connexe. Ainsi, une stratégie que vous pourriez prendre serait de coder manuellement ce genre de chose et de continuer à résoudre pour la plus grande valeur singulière non résolue jusqu'à ce que vous vouliez arrêter, en utilisant quelque chose comme une stratégie de décalage et d'inversion. Il peut y avoir des façons élégantes de faire ce genre de choses dans des packages sophistiqués comme SLEPc .

Une autre stratégie serait la suivante:

  • s1
  • τs1Fτ0<F1
  • Appelez la routine SVD clairsemée.

k

Geoff Oxberry
la source
Si vous ne spécifiez pas «k» dans scipy.sparse.linalg.svds, il sera par défaut à k = 6, quel que soit le paramètre «tol». Ce n'est pas clair s'il s'agit d'un bug, ou si 'tol' est censé se référer à la précision des valeurs singulières calculées (plutôt qu'à leur taille)
Nick Alger