Applicare PCA su una matrice sparsa molto grande


16

Sto eseguendo un'attività di classificazione del testo con R e ottengo una matrice di termini documento con dimensioni 22490 per 120.000 (solo 4 milioni di voci diverse da zero, meno dell'1% delle voci). Ora voglio ridurre la dimensionalità utilizzando PCA (analisi dei componenti principali). Sfortunatamente, R non è in grado di gestire questa enorme matrice, quindi memorizzo questa matrice sparsa in un file nel "Matrix Market Format", sperando di usare alcune altre tecniche per fare PCA.

Quindi qualcuno potrebbe darmi qualche suggerimento per utili librerie (qualunque sia il linguaggio di programmazione), che potrebbe fare facilmente PCA con questa matrice su larga scala o fare un PCA a mano libera da solo, in altre parole, calcolare inizialmente la matrice di covarianza, e quindi calcolare gli autovalori e gli autovettori per la matrice di covarianza .

Quello che voglio è calcolare tutti i PC (120.000) e scegliere solo i migliori PC N, che rappresentano una varianza del 90% . 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à scarsa e le sue dimensioni sarebbero 120.000 per 120.000, che è impossibile da gestire con una sola macchina. Inoltre, i caricamenti (autovettori) saranno estremamente grandi e dovrebbero essere archiviati in formato sparse.

Grazie mille per qualsiasi aiuto!

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


Quanto è scarsa la matrice? Come si usa l'SVD risultante? Se ne hai solo bisogno, potresti probabilmente approssimarlo molto più a buon mercato.
Arnold Neumaier,

@ArnoldNeumaier Mi scusi, ho dimenticato di aggiungere le informazioni sparse. Ho aggiornato il post, insieme alla mia idea completa.
Ensom Hodder,

ciascuno di SLEPc, mahout e irlba suggeriti nelle risposte finora sembrano adatti al tuo problema.
Arnold Neumaier,

1
Perché vuoi calcolare tutti i 120k? Sembra che tu voglia solo quelli che rappresentano il 90% della varianza, che dovrebbe essere molto più economico da calcolare.
Jed Brown,

@JedBrown Hey Jed, hai perfettamente ragione! Sono interessato solo a coloro che rappresentano la varianza del 90% e anche agli autovettori corrispondenti (per la trasformazione del set di dati di test in seguito). Potresti farmi sapere i tuoi metodi più economici ?
Ensom Hodder,

Risposte:


4

Suggerisco il pacchetto irlba: produce praticamente gli stessi risultati di svd, ma è possibile definire un numero minore di valori singolari da risolvere. Un esempio, utilizzando matrici sparse per risolvere il premio Netflix, è disponibile qui: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html


Grazie per i tuoi commenti In effetti, avevo visto quel video e ieri avevo provato anche il pacchetto irlba , ma sembrava che potesse essere usato solo per calcolare alcuni valori singolari. Tuttavia, come indicato nel post, voglio calcolare TUTTI i valori singolari (120.000), in modo da scegliere il numero adeguato di PC in base alle variazioni che rappresentano. In questo caso, immagino che l' irlba non sia più adatto.
Ensom Hodder,

Puoi usare i risultati di SVD in modo simile al PCA? Non è necessario centrare i dati PRIMA di eseguire SVD, al fine di eseguire la PCA?
Zach,

@Zach - SVD è l'algoritmo principale dietro PCA (vedi prcomp - stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ). Anche il centraggio dei dati è una procedura standard prima di sottoporsi alla PCA, sebbene esistano molte opzioni a seconda della domanda (ad esempio, possono essere applicati anche diversi tipi di ridimensionamento).
Marc nella scatola

Quanto è grande un affare se non centro i dati prima di SVD? Ho una matrice sparsa che si adatta alla memoria, ma il centraggio lo renderebbe denso e troppo grande per adattarsi alla memoria.
Zach,

@Zach - Dipende molto da come vuoi mettere in relazione i tuoi campioni. Se non riesci a lavorare con dati centrati a causa dei limiti di memoria, suppongo che la decisione sia stata presa per te. In generale, la centratura dei dati fa funzionare la PCA su una matrice di covarianza dei campioni, mentre la centratura e il ridimensionamento dei dati fa funzionare la PCA su una matrice di correlazione. Per ulteriori informazioni su queste decisioni, è possibile prendere in considerazione la possibilità di porre una domanda su stats.stackexchange.com o cercare le risposte esistenti relative all'APC.
Marc nella scatola il

8

Suggerisco di usare SLEPc per calcolare un SVD parziale. Vedere il capitolo 4 del Manuale dell'utente e le pagine man SVD per i dettagli.


1
Poiché desidera la PCA, deve centrare i dati prima di calcolare l'SVD. Questo distruggerà la scarsità. Esiste un modo in cui SLEPc può adattarsi a questo?
dranxo,

3
Questo è solo scarso + basso rango. SLEPc non ha bisogno di voci di matrice, ma solo di un operatore lineare, che può essere applicato come matrice sparsa più una correzione.
Jed Brown,

2

Voto per il mahout, che è ottimo anche per altre attività di PNL / AT e implementa la mappa / riduzione.


Sì, hai ragione, mahout è esattamente nella mia road map. Ma preferisco creare un prototipo con alcune tecniche "semplici" (suppongo) in anticipo.
Ensom Hodder,

1

Suggerirei di utilizzare una scomposizione incrementale del valore singolare, di cui ce ne sono molti in letteratura. Per esempio:

  • le relazioni tecniche di Matthew Brand 1 e 2 sono abbastanza facili da seguire
  • La tesi di master di Chris Baker , il suo software IncPACK e il suo successivo articolo sul metodo SVD incrementale
  • Bunch e Nielsen hanno pubblicato il primo documento noto
  • Articoli di Hall sull'aggiornamento degli autovalori 1 e 2
  • Analisi sequenziale di Karhunen-Loeve di Levy, et al., Che è sostanzialmente la stessa cosa

Tutti questi approcci si riducono a quanto segue:

  • iniziare con un piccolo set di dati
  • calcolare un SVD in qualche modo (questo passaggio è banale per una matrice a colonna singola)
  • ripetere fino al termine:
    • aggiungi un nuovo set di dati
    • utilizzare SVD esistenti e aggiornare le regole per calcolare SVD del nuovo set di dati

N


0

Puoi ancora usare R.

Revolution Rè una build di R che gestisce set di dati più grandi della RAM. Utilizzare la funzione princomp.

Ha anche una gamma completa di funzioni statistiche appositamente progettate per problemi di stile di big data che non si adattano alla RAM, ad esempio regressione lineare, regressione logistica, quantili, ecc.

Puoi scaricare gratuitamente la versione accademica con tutte le funzionalità, selezionando la casella "Sono un accademico".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.