Come invertire PCA e ricostruire variabili originali da diversi componenti principali?


113

L'analisi dei componenti principali (PCA) può essere utilizzata per la riduzione della dimensionalità. Dopo aver eseguito tale riduzione di dimensionalità, come si può ricostruire approssimativamente le variabili / caratteristiche originali da un piccolo numero di componenti principali?

In alternativa, come si possono rimuovere o eliminare diversi componenti principali dai dati?

In altre parole, come invertire PCA?


Dato che la PCA è strettamente correlata alla decomposizione del valore singolare (SVD), la stessa domanda può essere posta come segue: come invertire SVD?


10
Sto postando questo thread di domande e risposte, perché sono stanco di vedere dozzine di domande che fanno proprio questa cosa e non sono in grado di chiuderle come duplicati perché non abbiamo un thread canonico su questo argomento. Esistono diversi thread simili con risposte decenti, ma tutti sembrano avere seri limiti, come ad esempio concentrarsi esclusivamente su R.
amoeba,

4
Apprezzo lo sforzo - penso che ci sia un disperato bisogno di raccogliere informazioni su PCA, cosa fa, cosa non fa, in uno o più thread di alta qualità. Sono contento che tu l'abbia preso per farlo!
Sycorax

1
Non sono convinto che questa risposta canonica "pulizia" serva al suo scopo. Ciò che abbiamo qui è un'eccellente, generica domanda e risposta, ma ognuna delle domande aveva alcune sottigliezze sul PCA in pratica che qui si perdono. Fondamentalmente hai preso tutte le domande, fatto PCA su di loro e scartato i componenti principali inferiori, dove a volte sono nascosti dettagli ricchi e importanti. Inoltre, sei tornato al libro di testo Linear Algebra notation che è esattamente ciò che rende PCA opaco per molte persone, invece di usare la lingua franca degli statistici casuali, che è R.
Thomas Browne,

1
@Thomas Grazie. Penso che abbiamo un disaccordo, felice di discuterne in chat o in Meta. Molto brevemente: (1) Potrebbe davvero essere meglio rispondere a ciascuna domanda individualmente, ma la dura realtà è che non succede. Molte domande rimangono senza risposta, come probabilmente le vostre. (2) La comunità qui preferisce fortemente risposte generiche utili a molte persone; puoi vedere quale tipo di risposte viene votata di più. (3) Concordo sulla matematica, ma è per questo che ho dato il codice R qui! (4) Non sono d'accordo sulla lingua franca; personalmente, non conosco R.
amoeba,

@amoeba Temo di non riuscire a trovare la chat in quanto non ho mai partecipato a meta discussioni prima.
Thomas Browne,

Risposte:


147

PCA calcola gli autovettori della matrice di covarianza ("assi principali") e li ordina in base ai loro autovalori (quantità di varianza spiegata). I dati centrati possono quindi essere proiettati su questi assi principali per produrre componenti principali ("punteggi"). Ai fini della riduzione della dimensionalità, è possibile conservare solo un sottoinsieme dei componenti principali e scartare il resto. (Vedi qui per l'introduzione di un laico al PCA .)

Consenti a essere la matrice di dati con righe (punti dati) e colonne (variabili o caratteristiche). Dopo aver sottratto il vettore medio da ogni riga, si ottiene la centrata matrice dati . Sia la matrice di alcuni autovettori che vogliamo usare; questi sarebbero spesso gli autovettori con gli autovalori più grandi. Quindi la matrice delle proiezioni PCA ("punteggi") sarà semplicemente data da .Xrawn×pnpμXVp×kkkn×kZ=XV

Questo è illustrato nella figura seguente: la prima sottotrama mostra alcuni dati centrati (gli stessi dati che utilizzo nelle mie animazioni nel thread collegato) e le sue proiezioni sul primo asse principale. La seconda sottotrama mostra solo i valori di questa proiezione; la dimensionalità è stata ridotta da due a uno:

inserisci qui la descrizione dell'immagine

Per poter ricostruire le due variabili originali da questo componente principale, possiamo mapparlo di nuovo a dimensioni con . In effetti, i valori di ciascun PC dovrebbero essere posizionati sullo stesso vettore utilizzato per la proiezione; confronta i grafici secondari 1 e 3. Il risultato è quindi dato da . Lo sto visualizzando sulla terza sottotrama sopra. Per ottenere la ricostruzione finale , dobbiamo aggiungere il vettore medio a quello:pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

Si noti che si può passare direttamente dalla prima sottotrama alla terza moltiplicando con la matrice ; si chiama matrice di proiezione . Se tutti vengono utilizzati autovettori, quindi è la matrice identità (viene eseguita alcuna riduzione dimensionalità, perciò "ricostruzione" è perfetto). Se viene utilizzato solo un sottoinsieme di autovettori, non è identità.XVVpVV

Questo funziona per un punto arbitrario nello spazio PC; può essere mappato allo spazio originale tramite .zx^=zV

Eliminare (rimuovere) i PC principali

A volte si vuole scartare (per rimuovere) uno o pochi dei PC principali e mantenere il resto, invece di mantenere i PC principali e scartare il resto (come sopra). In questo caso tutte le formule rimangono esattamente le stesse , ma dovrebbe consistere in tutti gli assi principali tranne quelli che si vogliono scartare. In altre parole, dovrebbe sempre includere tutti i PC che si desidera mantenere.VV

Avvertenza su PCA sulla correlazione

Quando la PCA viene eseguita sulla matrice di correlazione (e non sulla matrice di covarianza), i dati grezzi non sono centrati solo sottraendo ma anche ridimensionati dividendo ciascuna colonna per la sua deviazione standard . In questo caso, per ricostruire i dati originali, è necessario ridimensionare le colonne di con e solo successivamente aggiungere nuovamente il vettore medio .XrawμσiX^σiμ


Esempio di elaborazione delle immagini

Questo argomento emerge spesso nel contesto dell'elaborazione delle immagini. Considera Lenna - una delle immagini standard nella letteratura sull'elaborazione delle immagini (segui i link per trovare da dove viene). In basso a sinistra, visualizzo la variante in scala di grigi di questa immagine (file disponibile qui ).512×512

Due versioni in scala di grigi dell'immagine di Lenna.  Quello a destra è granuloso ma sicuramente riconoscibile.

Possiamo considerare questa immagine in scala di grigi come una matrice di dati . Eseguo PCA su di esso e calcolo utilizzando i primi 50 componenti principali. Il risultato è visualizzato sulla destra.512×512XrawX^raw


Ripristino SVD

La PCA è strettamente correlata alla decomposizione del valore singolare (SVD), vedere Relazione tra SVD e PCA. Come utilizzare SVD per eseguire PCA? per ulteriori dettagli. Se una matrice è SVD-ed come e si seleziona un vettore dimensionale che rappresenta il punto nello spazio "ridotto" di dimensioni, quindi per nuovo a dimensioni necessario moltiplicarlo con .n×pXX=USVkzUkpS1:k,1:kV:,1:k


Esempi in R, Matlab, Python e Stata

Condurrò il PCA sui dati Fisher Iris e poi lo ricostruirò usando i primi due componenti principali. Sto facendo PCA sulla matrice di covarianza, non sulla matrice di correlazione, cioè non sto ridimensionando le variabili qui. Ma devo ancora aggiungere il mezzo indietro. Alcuni pacchetti, come Stata, si occupano di ciò attraverso la sintassi standard. Grazie a @StasK e @Kodiologist per il loro aiuto con il codice.

Controlleremo la ricostruzione del primo datapoint, che è:

5.1        3.5         1.4        0.2

Matlab

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

Produzione:

5.083      3.5174      1.4032     0.21353

R

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

Produzione:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

Per esempio R elaborato di ricostruzione di immagini PCA vedi anche questa risposta .

Pitone

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

Produzione:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

Si noti che questo differisce leggermente dai risultati in altre lingue. Questo perché la versione di Python del set di dati di Iris contiene errori .

Stata

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  

1
In MATLAB è possibile recuperare mu dalle uscite PCA standard e fornire anche il numero di componenti negli ingressi.
Aksakal,

2
@Aksakal Ho cercato di rendere tutti e tre gli estratti di codice il più simili (e il più chiaro possibile); in particolare, volevo calcolare a mano prima di chiamare pca (), e anche eseguire PCA con tutti i componenti e utilizzare solo i componenti quando si eseguivano prodotti a punti tra punteggi e autovettori. Ora ho modificato il codice Python per seguire lo stesso schema. μnComp
amoeba,

3
Rimuoverei tutto dalla risposta che non è correlata alla risposta diretta alla domanda, come l'immagine di quella ragazza carina e l'elaborazione delle immagini. Se qualcuno non è interessato alle immagini rende difficile il consumo. Ricorda che chi sta ponendo la domanda è già profondamente confuso.
Aksakal,

5
Lenna è un set di dati standard come l'iride.
StasK,

2
@amoeba Stavo parlando di dimensioni, profondità di bit, persino pixel neri nel bordo. Non ho una versione definitiva http://www.ece.rice.edu/~wakin/images/ : "Sembra che ci siano molte versioni dell'immagine di prova di Lena (aka" Lenna "). Questo problema è stato notato da Shapiro nel suo documento di zerotree del 1993, e rimane sorprendentemente vero oggi "
Laurent Duval,
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.