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:
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:pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+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à.XVV⊤pVV⊤
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
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=USV⊤kzUkpS⊤1: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