Quelle est la meilleure façon de calculer la décomposition en valeurs singulières (SVD) d'une très grande matrice positive (65M x 3,4M) où les données sont extrêmement rares?
Moins de 0,1% de la matrice n'est pas nul. J'ai besoin d'un moyen qui:
- s'inscrira dans la mémoire (je sais qu'il existe des méthodes en ligne)
- sera calculé dans un délai raisonnable: 3,4 jours
- sera suffisamment précis, mais la précision n'est pas ma principale préoccupation et je voudrais pouvoir contrôler la quantité de ressources que j'y consacre.
Ce serait formidable d'avoir une bibliothèque Haskell, Python, C # etc. qui l'implémente. Je n'utilise pas mathlab ou R mais si nécessaire je peux aller avec R.
Réponses:
S'il tient dans la mémoire, construisez une matrice clairsemée dans R à l'aide du package Matrix et essayez irlba pour le SVD. Vous pouvez spécifier combien de vecteurs singuliers vous voulez dans le résultat, ce qui est une autre façon de limiter le calcul.
C'est une assez grosse matrice, mais j'ai eu de très bons résultats avec cette méthode dans le passé.
irlba
est assez à la pointe de la technologie. Il utilise l' algorithme de bi-diagonalisation Lanczos redémarré implicitement .Il peut parcourir l'ensemble de données de prix netflix (480 189 lignes par 17 770 colonnes, 100 480 807 entrées non nulles) en millisecondes. Votre ensemble de données est ~ 200 000 fois plus grand que l'ensemble de données Netflix, donc cela prend beaucoup plus de temps que cela. Il pourrait être raisonnable de s'attendre à ce qu'il puisse effectuer le calcul en quelques jours.
la source
Matrix
? Essayez de limiter le nombre de valeurs singulières que vous calculez ... regardez peut-être simplement le top 10?la source