2012-05-23 10 views
13

Sto eseguendo un'operazione di classificazione testo con R e ottengo una matrice di termini documento con dimensione 22490 per 120.000 (solo 4 milioni di voci diverse da zero, meno dell'1% di voci). Ora voglio ridurre la dimensionalità utilizzando PCA (Principal Component Analysis). Sfortunatamente, R non può gestire questa enorme matrice, quindi immagazzino questa matrice sparsa in un file in "Matrix Market Format", sperando di usare altre tecniche per fare PCA.Applicare PCA su matrice sparse molto grande

Allora qualcuno mi potrebbe dare qualche suggerimento per le biblioteche utili (qualunque sia il linguaggio di programmazione), che potrebbe fare PCA con questa matrice di grandi dimensioni con facilità, o fare un PCA longhand da me, in altre parole, calcolare il matrice di covarianza in un primo momento, quindi calcolare gli autovalori e gli autovettori per la matrice di covarianza.

Quello che voglio è quello di calcolare tutti i PC (120.000) e scegliere solo i primi N PC, che rappresenta il 90% della varianza. Ovviamente, in questo caso, devo dare una soglia a priori per impostare alcuni valori di varianza molto piccoli su 0 (nella matrice di covarianza), altrimenti la matrice di covarianza non sarà sparsa e la sua dimensione sarebbe 120.000 per 120.000, che è impossibile da gestire con una sola macchina. Inoltre, i loadings (autovettori) saranno estremamente grandi e dovrebbero essere archiviati in un formato sparso.

Grazie mille per qualsiasi aiuto!

Nota: utilizzo una macchina con 24 GB di RAM e 8 core di CPU.

+0

Non so se sia corretto al 100%, ma penso che MatLab possa fare il lavoro. – Anton

+0

Se non trovi alcuna gioia qui, potrebbe valere la pena chiedere su http://stats.stackexchange.com/ – NPE

+0

@aix Grazie per i tuoi consigli, l'ho spostato nella beta della scienza computazionale e mi sono utile suggerimenti. Puoi anche seguirlo in questo [URL] (http://scicomp.stackexchange.com/questions/2313/apply-pca-on-very-large-sparse-matrix) –

risposta

11

Il toolkit Python scikit-learn ha alcune varianti PCA, di cui RandomizedPCA in grado di gestire matrici sparse in uno dei formati supportati da scipy.sparse. scipy.io.mmread dovrebbe essere in grado di analizzare il formato Matrix Market (non l'ho mai provato, però).

Disclaimer: Sono nel team di sviluppo di scikit-learn.

MODIFICA: il supporto della matrice sparsa di RandomizedPCA è stato deprecato in scikit-learn 0.14. TruncatedSVD deve essere utilizzato al suo posto. Guarda la documentazione per dettagli.

+0

Grazie mille @larmans, in una certa misura, il tuo metodo proposto può fare PCA con la matrice sparsa, ma può solo calcolare una piccola quantità di PC, a causa del grande consumo di memoria: - ( –

+0

Si noti che 'RandomizedPCA' è stato deprecato in favore di' PCA' con argomento parola chiave 'svd_solver = 'randomized'' – BallpointBen

6

Invece di eseguire PCA, è possibile provare Latent Dirichlet Allocation (LDA), che decompone la matrice parola-documento in una matrice di argomenti del documento e della parola argomento. Ecco un link a un'implementazione R: http://cran.r-project.org/web/packages/lda/ - ci sono un bel po 'di implementazioni là fuori, anche se tu google.

Con LDA è necessario specificare un numero fisso di argomenti (simile ai componenti principali) in anticipo. Un'alternativa potenzialmente migliore è HDP-LDA (http://www.gatsby.ucl.ac.uk/~ywteh/research/npbayes/npbayes-r21.tgz), che apprende il numero di argomenti che formano una buona rappresentazione del corpus.

Se è possibile adattare il nostro set di dati in memoria (che sembra possibile), non si dovrebbe avere problemi a eseguire il codice LDA.

Come indicato da un numero di persone nel forum scicomp, non è necessario calcolare tutti i componenti del principio 120k. Algoritmi come http://en.wikipedia.org/wiki/Power_iteration calcolano gli autovalori più grandi di una matrice e gli algoritmi LDA convergeranno in una rappresentazione di lunghezza minima delle descrizioni dei dati, dato il numero di argomenti specificati.