Come fare SVD e PCA con i big data?


29

Ho un ampio set di dati (circa 8 GB). Vorrei usare l'apprendimento automatico per analizzarlo. Quindi, penso che dovrei usare SVD quindi PCA per ridurre la dimensionalità dei dati per efficienza. Tuttavia, MATLAB e Octave non possono caricare un set di dati così grande.

Quali strumenti posso usare per fare SVD con una così grande quantità di dati?


Ciao e benvenuto in DS! Forse potresti elaborare un po 'il tuo set di dati. Quante righe e colonne hai? Ciò potrebbe avere un impatto su possibili soluzioni.
S. Kolassa - Ripristina Monica il

23711341 righe e 8 colonne. Potrei provare a rimuovere 1-2 colonne. Non sembrano collegati al mio problema.
David S.

Dovresti campionare le righe prima delle colonne qui. C'è un motivo per cui non è possibile campionare casualmente le righe per ridurre le dimensioni dei dati?
Suppongo che le

Scusa se non mi sono chiarito. Il mio obiettivo è fare PCA. Penso che SVD sui dati di esempio non possa aiutarmi a fare PCA, giusto?
David S.

La PCA viene solitamente implementata calcolando SVD sulla matrice di covarianza. Il calcolo della matrice di covarianza è un compito imbarazzantemente parallelo, quindi dovrebbe ridimensionarsi facilmente con il numero di record.
Anony-Mousse,

Risposte:


41

Innanzitutto, la riduzione della dimensionalità viene utilizzata quando si hanno molte dimensioni covariate e si desidera ridurre la dimensione del problema ruotando i punti dati in una nuova base ortogonale e prendendo solo gli assi con la varianza maggiore. Con 8 variabili (colonne) il tuo spazio è già a bassa dimensione, è improbabile che ridurre il numero di variabili risolva ulteriormente i problemi tecnici con le dimensioni della memoria, ma può influire molto sulla qualità del set di dati. Nel tuo caso concreto è più promettente dare un'occhiata all'apprendimento onlinemetodi. In parole povere, invece di lavorare con l'intero set di dati, questi metodi ne prendono una piccola parte (spesso denominati "mini-batch") alla volta e creano un modello in modo incrementale. (Personalmente mi piace interpretare la parola "online" come riferimento a una fonte infinitamente lunga di dati da Internet come un feed di Twitter, dove non è possibile caricare l'intero set di dati in una sola volta).

E se volessi davvero applicare la tecnica di riduzione della dimensionalità come la PCA a un set di dati che non si adatta alla memoria? Normalmente un set di dati è rappresentato come una matrice di dati X di dimensione n x m , dove n è il numero di osservazioni (righe) e m è un numero di variabili (colonne). In genere i problemi con la memoria provengono solo da uno di questi due numeri.

Troppe osservazioni (n >> m)

Quando hai troppe osservazioni , ma il numero di variabili va da piccolo a moderato, puoi costruire la matrice di covarianza in modo incrementale . In effetti, il tipico PCA consiste nel costruire una matrice di covarianza di dimensioni m x m e applicarvi una decomposizione di valore singolare. Con m = 1000 variabili di tipo float64, una matrice di covarianza ha dimensioni 1000 * 1000 * 8 ~ 8 Mb, che si adatta facilmente alla memoria e può essere utilizzata con SVD. Quindi devi solo costruire la matrice di covarianza senza caricare l'intero set di dati in memoria: un'attività piuttosto tracciabile .

In alternativa, è possibile selezionare un piccolo campione rappresentativo dal set di dati e approssimare la matrice di covarianza . Questa matrice avrà le stesse proprietà del normale, solo un po 'meno accurata.

Troppe variabili (n << m)

D'altra parte, a volte, quando si hanno troppe variabili , la matrice di covarianza non si adatta alla memoria. Ad esempio, se lavori con immagini 640x480, ogni osservazione ha 640 * 480 = 307200 variabili, il che si traduce in una matrice di covarianza da 703Gb! Non è sicuramente quello che vorresti conservare nella memoria del tuo computer, o anche nella memoria del tuo cluster. Quindi dobbiamo ridurre le dimensioni senza costruire una matrice di covarianza.

Il mio metodo preferito per farlo è la proiezione casuale . In breve, se si dispone di un set di dati X di dimensione n x m , è possibile moltiplicarlo per una matrice casuale sparsa R di dimensione m x k (con k << m ) e ottenere una nuova matrice X ' di dimensione molto più piccola n x k con approssimativamente le stesse proprietà di quello originale. Perché funziona Bene, dovresti sapere che PCA mira a trovare una serie di assi ortogonali (componenti principali) e proiettare i tuoi dati sul primo kdi loro. Si scopre che i vettori casuali sparsi sono quasi ortogonali e quindi possono anche essere usati come nuova base.

E, naturalmente, non è necessario moltiplicare l'intero set di dati X per R : è possibile tradurre ogni osservazione x nella nuova base separatamente o in mini-batch.

C'è anche un algoritmo in qualche modo simile chiamato SVD casuale . Non ho alcuna esperienza reale con esso, ma puoi trovare un codice di esempio con spiegazioni qui .


Come linea di fondo, ecco un breve elenco di controllo per la riduzione della dimensionalità di grandi set di dati:

  1. Se non hai molte dimensioni (variabili), utilizza semplicemente gli algoritmi di apprendimento online.
  2. Se ci sono molte osservazioni, ma un numero moderato di variabili (la matrice di covarianza si adatta alla memoria), costruisci la matrice in modo incrementale e usa il normale SVD.
  3. Se il numero di variabili è troppo elevato, utilizzare algoritmi incrementali.

3
Nel complesso, mi piace la tua risposta, ma la frase di apertura non è del tutto corretta. PCA non è adatto per molte dimensioni con bassa varianza; piuttosto, è adatto a molte dimensioni con varianza correlata . Per un determinato set di dati, la varianza potrebbe essere elevata in tutte le dimensioni, ma fintanto che esiste una covarianza elevata, la PCA può comunque produrre una significativa riduzione della dimensionalità.
Bogatron,

1
@bogatron: buona cattura, grazie. In effetti, mi riferivo alla varianza alta / bassa in alcune dimensioni, forse non originali. Ad esempio, in questa immagine queste dimensioni sono definite da 2 frecce, non da assi x / y originali. PCA cerca di trovare questi nuovi assi e li ordina in base al valore della varianza lungo ciascun asse. Comunque, come hai sottolineato, era una brutta formulazione, quindi ho cercato di riformulare la mia idea. Spero che ora sia più chiaro.
Amico,

Questo ha senso per me. +1.
Bogatron,

7

Non preoccuparti.

Prima regola di programmazione, che si applica anche alla scienza dei dati: far funzionare tutto su un piccolo problema di test.

quindi prendi un campione casuale dei tuoi dati, ad esempio 100.000 righe. provare algoritmi diversi, ecc. una volta che tutto ha funzionato in modo soddisfacente, è possibile provare set di dati più grandi (e più grandi) e vedere come l'errore di test si riduce quando si aggiungono più dati.

inoltre non si desidera applicare svd a sole 8 colonne: lo si applica quando si hanno molte colonne.


1
+1 per te non vuoi applicare svd solo a 8 colonne: lo applichi quando hai molte colonne.
S. Kolassa - Ripristina Monica il

6

La PCA viene solitamente implementata calcolando SVD sulla matrice di covarianza.

Il calcolo della matrice di covarianza è un compito imbarazzantemente parallelo , quindi scala in modo lineare con il numero di record ed è banale da distribuire su più macchine!

Basta fare un passaggio sui dati per calcolare i mezzi. Quindi un secondo passaggio per calcolare la matrice di covarianza. Questo può essere fatto facilmente con la riduzione della mappa - essenzialmente è lo stesso che calcolare nuovamente i mezzi. I termini di somma come nella covarianza sono banali da parallelizzare! Potrebbe essere necessario prestare attenzione ai dati numerici quando si sommano molti valori di grandezza simile.

Le cose cambiano quando hai un numero enorme di variabili . Ma su un sistema da 8 GB, dovresti essere in grado di eseguire PCA su fino a 20.000 dimensioni in memoria con le librerie BLAS. Ma allora potresti incontrare il problema che PCA non è più così affidabile, perché ha troppi gradi di libertà. In altre parole: si adatta facilmente. Ho visto la raccomandazione di avere almeno 10 * d * d record (o era d ^ 3). Quindi per 10000 dimensioni, dovresti avere almeno un miliardo di record (di 10000 dimensioni ... è molto!) Affinché il risultato sia statisticamente affidabile.


1

Anche se probabilmente puoi trovare alcuni strumenti che ti permetteranno di farlo su una singola macchina, stai entrando nella gamma in cui ha senso considerare strumenti "big data" come Spark, specialmente se pensi che il tuo set di dati potrebbe crescere. Spark ha un componente chiamato MLlib che supporta PCA e SVD. La documentazione ha esempi .


1

Abbiamo implementato SVD su un set di dati più grande utilizzando PySpark. Abbiamo anche confrontato la coerenza tra diversi pacchetti. Ecco il link


0

Consiglierei Python se valutassi pigramente il file avrai un minimo ingombro di memoria, e numpy / scipy ti daranno accesso a tutti gli strumenti che Octave / Matlab avrebbe.

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.