Come eseguire PCA per dati di altissima dimensionalità?


12

Per eseguire l'analisi dei componenti principali (PCA), è necessario sottrarre i dati di ciascuna colonna dai dati, calcolare la matrice del coefficiente di correlazione e quindi trovare gli autovettori e gli autovalori. Bene, piuttosto, questo è quello che ho fatto per implementarlo in Python, tranne per il fatto che funziona solo con piccole matrici perché il metodo per trovare la matrice del coefficiente di correlazione (corrcoef) non mi consente di usare un array con elevata dimensionalità. Dal momento che devo usarlo per le immagini, la mia attuale implementazione non mi aiuta davvero.

Ho letto che è possibile prendere semplicemente la tua matrice di dati e calcolare invece di , ma per me non funziona. Bene, non sono esattamente sicuro di capire cosa significhi, oltre al fatto che dovrebbe essere una matrice anziché (nel mio caso ). Ho letto su quelli nei tutorial sulle autovetture, ma nessuno di loro sembrava spiegarlo in modo tale da riuscire davvero a capirlo.D D / n D D / n n × n p × p p nDDD/nDD/nn×np×ppn

In breve, esiste una semplice descrizione algoritmica di questo metodo in modo che io possa seguirlo?


Quello che leggi è corretto. La matrice è chiamata matrice Grammo. I suoi autovettori sono componenti principali (ridimensionati). I suoi autovalori sono esattamente identici, fino al fattore , agli autovalori della matrice di covarianza . DD1/nDD/n
ameba dice di reintegrare Monica il

Risposte:


10

Il modo più semplice per eseguire PCA standard è centrare le colonne della matrice di dati (supponendo che le colonne corrispondano a variabili diverse) sottraendo i mezzi delle colonne e quindi eseguire un SVD. I vettori singolari di sinistra, moltiplicati per il corrispondente valore singolare, corrispondono ai componenti principali (stimati). I vettori singolari giusti corrispondono alle direzioni (stimate) del componente principale - questi sono gli stessi degli autovettori forniti da PCA. I valori singolari corrispondono alle deviazioni standard dei componenti principali (moltiplicati per un fattore della radice n, dove n è il numero di righe nella matrice dei dati) - lo stesso della radice quadrata degli autovalori fornita da PCA.

Se si desidera eseguire PCA sulla matrice di correlazione, è necessario standardizzare le colonne della matrice di dati prima di applicare SVD. Ciò equivale a sottrarre i mezzi (centraggio) e quindi a dividere per le deviazioni standard (ridimensionamento).

Questo sarà l'approccio più efficiente se desideri il PCA completo. Puoi verificare con un po 'di algebra che questo ti dia la stessa risposta del fare la decomposizione spettrale della matrice di covarianza del campione.

Esistono anche metodi efficienti per il calcolo di un SVD parziale, quando sono necessari solo pochi PC. Alcune di queste sono varianti dell'iterazione di potenza. L' algoritmo di Lanczos è un esempio correlato anche ai minimi quadrati parziali. Se la tua matrice è enorme, potresti stare meglio con un metodo approssimativo. Ci sono anche ragioni statistiche per regolarizzare la PCA quando questo è il caso.


Correggimi se sbaglio, ma penso che l'algoritmo Lanczos esegua la composizione elettronica e non SVD.
ameba dice di reintegrare Monica il

1
Un lettore interessato può consultare qui ulteriori dettagli sull'esecuzione della PCA tramite SVD: relazione tra SVD e PCA. Come usare SVD per eseguire PCA?
ameba dice di reintegrare Monica il

10

Quello che stai facendo in questo momento è vicino, ma devi assicurarti di moltiplicare gli autovettori di (data . data.T) / linesa sinistra data.Tper ottenere gli autovettori di (data.T . data) / lines. Questo a volte viene chiamato "trucco trasposizione".

Ecco qualche dettaglio in più. Supponiamo di avere una matrice cui vuoi eseguire il PCA; per semplicità, supponiamo che le colonne di siano già state normalizzate per avere una media zero, quindi dobbiamo solo calcolare gli autovettori della matrice di covarianza .AAATA

Ora se è una matrice , con , allora è una matrice molto grande . Quindi, invece di calcolare gli autovettori di , potremmo voler calcolare gli autovettori della matrice molto più piccola - assumendo che possiamo capire una relazione tra i due. Quindi, in che modo gli autovettori di collegati agli autovettori di ?Am×nn>>mATAn×nATAm×mAATATAAAT

Sia un autovettore di con autovalore . PoivAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

In altre parole, se è un autovettore di , allora è un autovettore di , con lo stesso autovalore. Quindi quando si esegue un PCA su , invece di trovare direttamente gli autovettori di (che può essere molto costoso), è più facile trovare gli autovettori di e quindi moltiplicarli a sinistra per per ottenere gli autovettori di .A A T A T v A T A A A T A v A A T A T A T v A T AvAATATvATAAATAvAATATATvATA


1
Questo suona come il "trucco del kernel" applicato al PCA. en.wikipedia.org/wiki/Kernel_PCA È un ottimo modo per gestire determinate matrici di grandi dimensioni.
Gilead,

+1. Forse si dovrebbe aggiungere che è chiamata matrice Grammo. AA
ameba dice di reintegrare Monica il

8

Sembra che quello che vuoi sia l'algoritmo NIPALS per eseguire la PCA. È un algoritmo molto popolare tra gli statistici. Ha molti vantaggi:

  • Computazionalmente meno costoso dei metodi di decomposizione SVD o autovalori se sono richiesti solo i primi componenti.
  • Ha requisiti di archiviazione più modesti in generale perché la matrice di covarianza non viene mai formata. Questa è una proprietà molto importante per set di dati molto grandi.
  • Può gestire i dati mancanti nel set di dati (anche se questo non è un problema nel tuo problema, poiché hai a che fare con le immagini).

Descrizione
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Algoritmo
Ecco una descrizione semplice ed eccellente dell'algoritmo (nella sezione 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Ricorda di indicare la scala centrale prima di fare PCA poiché è sensibile alla scala.


4

Per aggiungere la risposta di Gilead, sono algoritmi computazionalmente meno costosi per PCA troncati. NIPALS è davvero molto popolare, ma ho avuto molto successo con metodi approssimativi che eseguono una successione di adattamenti su dati parziali (ciò che spesso viene chiamato PCA per proiezione casuale). Questo è stato discusso in un thread metaoptimize .

Come hai detto Python, vorrei sottolineare che l'algoritmo è implementato in scikit-learn : la classe PCA . In particolare, viene utilizzato in un esempio che dimostra autofacce .

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.