Je fais une tâche de classification de texte avec R, et j'obtiens une matrice de termes de document avec la taille 22490 par 120 000 (seulement 4 millions d'entrées non nulles, moins de 1% d'entrées). Maintenant, je veux réduire la dimensionnalité en utilisant PCA (analyse en composantes principales). Malheureusement, R ne peut pas gérer cette énorme matrice, donc je stocke cette matrice clairsemée dans un fichier au "Matrix Market Format", en espérant utiliser d'autres techniques pour faire de l'ACP.
Alors, quelqu'un pourrait-il me donner quelques conseils pour des bibliothèques utiles (quel que soit le langage de programmation), qui pourraient facilement faire PCA avec cette matrice à grande échelle, ou faire moi-même une PCA à long terme, en d'autres termes, calculer la matrice de covariance dans un premier temps, et puis calculez les valeurs propres et les vecteurs propres pour la matrice de covariance .
Ce que je veux, c'est calculer tous les PC (120 000), et choisir uniquement les N meilleurs PC, qui représentent une variance de 90% . Évidemment, dans ce cas, je dois donner un seuil a priori pour définir des valeurs de variance très minimes à 0 (dans la matrice de covariance), sinon, la matrice de covariance ne sera pas clairsemée et sa taille serait de 120 000 par 120 000, ce qui est impossible à manipuler avec une seule machine. De plus, les chargements (vecteurs propres) seront extrêmement importants et devraient être stockés dans un format épars.
Merci beaucoup pour toute aide !
Remarque: J'utilise une machine avec 24 Go de RAM et 8 cœurs de processeur.
la source
Réponses:
Je suggère le package irlba - il produit pratiquement les mêmes résultats que svd, mais vous pouvez définir un plus petit nombre de valeurs singulières à résoudre. Un exemple, utilisant des matrices clairsemées pour résoudre le prix Netflix, peut être trouvé ici: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html
la source
Je suggère d'utiliser SLEPc pour calculer une SVD partielle. Voir le chapitre 4 du manuel de l'utilisateur et les pages de manuel SVD pour plus de détails.
la source
Je vote pour mahout qui est également bon pour d'autres tâches NLP / TA et implémente map / Reduce.
la source
Je suggère d'utiliser une décomposition incrémentielle de valeurs singulières, dont il existe de nombreux dans la littérature. Par exemple:
Toutes ces approches se réduisent à ce qui suit:
Dans votre application, si vous avez une idée d'où votre seuil de valeur singulier pour le hautN valeurs seront, vous pouvez utiliser cette valeur pour calculer un SVD tronqué; si la valeur de seuil est suffisamment petite, alors la matrice que vous devez garder en mémoire sera également petite (seules les valeurs singulières au-dessus de la valeur de seuil sont conservées, ainsi que leurs vecteurs singuliers; il n'est même pas nécessaire de garder les singuliers gauche et droit vecteurs, dans l'algorithme de Brand).
la source
Vous pouvez toujours utiliser R.
Revolution R
est une version de R qui gère des ensembles de données plus volumineux que la RAM. Utilisez la fonctionprincomp
.Il dispose également d'une gamme complète de fonctions de statistiques spécialement conçues pour les problèmes de style Big Data qui ne rentrent pas dans la RAM, par exemple la régression linéaire, la régression logistique, les quantiles, etc.
Vous pouvez télécharger gratuitement la version académique complète en cochant la case "Je suis un universitaire".
la source