Algoritmo PCA più veloce per dati ad alta dimensione


11

Vorrei eseguire un PCA su un set di dati composto da circa 40.000 campioni, ognuno dei quali visualizza circa 10.000 funzioni.

L'uso della funzione princomp di Matlab richiede costantemente più di mezz'ora, a quel punto uccido il processo. Vorrei trovare un'implementazione / algoritmo che funziona in meno di 10 minuti. Quale sarebbe l'algoritmo più veloce? Quanto tempo impiegherebbe un Ram i7 dual core / 4GB?


Sì, hai ragione, dovrei essere più preciso. Ci vuole più di mezz'ora, quindi ho deciso di interrompere il processo. Devo farlo almeno dieci volte, sarebbe bello avere qualcosa che funzioni in meno di 10 minuti
morbido

Quanto è scarsa la tua matrice?
Arnold Neumaier il

La percentuale di zeri nella matrice è superiore all'80%
dolce

Dai un'occhiata anche a kernal-PCA.
meawoppl,

Risposte:


11

Prima di tutto, dovresti specificare se vuoi tutti i componenti o quelli più significativi?

Indica la tua matrice con N come numero di campioni e dimensione M.UNRN×MNM

Nel caso in cui si desideri che tutti i componenti la strada classica da percorrere sia calcolare la matrice di covarianza (che ha una complessità temporale di O ( N M 2 ) ) e quindi applicare SVD ad essa ( O aggiuntiva ( M 3 ) ). In termini di memoria questo richiederebbe O ( 2 M 2 ) (matrice di covarianza + vettori singolari e valori formano base ortogonale) o 1,5 GB in doppia precisione per il particolare A .CRM×MO(NM2)O(M3)O(2M2)1.5UN

È possibile applicare SVD direttamente alla matrice se si normalizza ciascuna dimensione prima di quella e si prendono i vettori singolari a sinistra. Tuttavia, praticamente mi aspetterei che SVD della matrice A impiegherà più tempo.UNUN

Se hai bisogno solo di una frazione dei componenti (forse più significativi) potresti voler applicare PCA iterativo . Per quanto ne so, tutti questi algoritmi sono strettamente correlati al processo di Lanczos, quindi dipendete dallo spettro della e praticamente sarà difficile ottenere la precisione di SVD per i vettori ottenuti e si degraderà con il numero di vettore singolare.C


2

Immagino che ti servano solo poche (o poche centinaia) coppie di valori / vettore singolari dominanti. Quindi è meglio usare un metodo iterativo, che sarà molto più veloce e consumerà molta meno memoria.

In Matlab, vedi

aiutare svds


Sì, sembra che i metodi iterativi siano molto più veloci se avessi bisogno solo dei primi cento componenti.
dolce

Per quanto riguarda lo svds, ho provato a mettere la mia matrice in un formato scarso e modificare la funzione princomp per mettere svds invece di svd, e con mia sorpresa ci è voluto molto più tempo su una matrice 2000 * 4000 (180 s invece di 15 s ). Bizzarro ...
dolce

1
Non è necessario passare al formato sparse. Inoltre, è necessario ridurre il numero di singoli vettori che si desidera calcolare. Per calcolare svd pieno, svds non è adatto.
Arnold Neumaier il

2
Da notare anche per le modalità dominanti i nuovi metodi svd randomizzati, come in stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger


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.