PCA berechnet Eigenvektoren der Kovarianzmatrix ("Hauptachsen") und sortiert sie nach ihren Eigenwerten (Betrag der erklärten Varianz). Die zentrierten Daten können dann auf diese Hauptachsen projiziert werden, um Hauptkomponenten ("Scores") zu erhalten. Zum Zwecke der Dimensionsreduzierung kann man nur eine Teilmenge der Hauptkomponenten behalten und den Rest verwerfen. ( Eine Einführung in PCA für Laien finden Sie hier .)
Xrawn×pnpμXVp×kkkn×kZ=XV
Dies wird in der folgenden Abbildung veranschaulicht: Die erste Teilzeichnung zeigt einige zentrierte Daten (dieselben Daten, die ich in meinen Animationen im verknüpften Thread verwende) und ihre Projektionen auf der ersten Hauptachse. Der zweite Untergrund zeigt nur die Werte dieser Projektion; Die Dimensionalität wurde von zwei auf eins reduziert:
Um die beiden ursprünglichen Variablen aus dieser einen Hauptkomponente rekonstruieren zu können, können wir sie mit wieder auf Dimensionen abbilden . In der Tat sollten die Werte jedes PCs auf den gleichen Vektor gelegt werden, der für die Projektion verwendet wurde. Vergleiche Untergrund 1 und 3. Das Ergebnis ergibt sich dann aus . Ich zeige es im dritten Untergrund oben an. Um die endgültige Rekonstruktion , müssen wir den mittleren Vektor hinzufügen :pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+Mean
Beachten Sie, dass Sie direkt vom ersten zum dritten Untergrund wechseln können, indem Sie mit der Matrix multiplizieren . es wird eine Projektionsmatrix genannt . Wenn alle Eigenvektoren verwendet werden, ist die Identitätsmatrix (es wird keine Dimensionsreduktion durchgeführt, daher ist "Rekonstruktion" perfekt). Wenn nur eine Teilmenge von Eigenvektoren verwendet wird, handelt es sich nicht um Identität.XVV⊤pVV⊤
Dies funktioniert für einen beliebigen Punkt im PC-Bereich. Es kann über auf den ursprünglichen Bereich abgebildet werden .zx^=zV⊤
Verwerfen (Entfernen) führender PCs
Manchmal möchte man einen oder mehrere der führenden PCs verwerfen (entfernen) und den Rest behalten, anstatt die führenden PCs zu behalten und den Rest zu verwerfen (wie oben). In diesem Fall bleiben alle Formeln exakt gleich , aber sollte aus allen Hauptachsen bestehen, mit Ausnahme derjenigen, die verworfen werden sollen. Mit anderen Worten, sollte immer alle PCs enthalten, die man behalten möchte.VV
Einschränkung bezüglich PCA auf Korrelation
Wenn PCA in einer Korrelationsmatrix (und nicht in einer Kovarianzmatrix) durchgeführt wird, werden die Rohdaten nicht nur durch Subtrahieren von zentriert, sondern auch durch Teilen jeder Spalte durch ihre Standardabweichung . In diesem Fall müssen zur Rekonstruktion der Originaldaten die Spalten von mit und erst dann der mittlere Vektor .XrawμσiX^σiμ
Beispiel für die Bildverarbeitung
Dieses Thema taucht häufig im Rahmen der Bildverarbeitung auf. Betrachten Sie Lenna - eines der Standardbilder in der Bildverarbeitungsliteratur (folgen Sie den Links, um herauszufinden, woher es kommt). Unten links zeige ich die Graustufenvariante dieses Bilds an (Datei hier verfügbar ).512×512
Wir können dieses Graustufenbild als Datenmatrix . Ich führe PCA darauf durch und berechne Verwendung der ersten 50 Hauptkomponenten. Das Ergebnis wird rechts angezeigt.512×512XrawX^raw
SVD wird zurückgesetzt
PCA ist sehr eng mit der Singular Value Decomposition (SVD) verwandt, siehe
Beziehung zwischen SVD und PCA. Wie verwende ich SVD, um PCA durchzuführen? für mehr Details. Wenn eine Matrix als SVD-ed ist und man einen dimensionalen Vektor auswählt , der den Punkt im "reduzierten" Raum darstellt von Dimensionen, dann muss man es mit multiplizieren , um es wieder auf Dimensionen .n×pXX=USV⊤kzUkpS⊤1:k,1:kV⊤:,1:k
Beispiele in R, Matlab, Python und Stata
Ich werde eine PCA für die Fisher Iris-Daten durchführen und sie dann unter Verwendung der ersten beiden Hauptkomponenten rekonstruieren. Ich mache PCA auf der Kovarianzmatrix, nicht auf der Korrelationsmatrix, dh ich skaliere hier nicht die Variablen. Aber ich muss noch den Mittelwert hinzufügen. Einige Pakete, wie z. B. Stata, erledigen dies mithilfe der Standardsyntax. Vielen Dank an @StasK und @Kodiologist für die Hilfe beim Code.
Wir werden die Rekonstruktion des ersten Datenpunktes überprüfen, nämlich:
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,:)
Ausgabe:
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,]
Ausgabe:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.0830390 3.5174139 1.4032137 0.2135317
Zum ausgearbeiteten R-Beispiel der PCA-Rekonstruktion von Bildern siehe auch diese Antwort .
Python
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,])
Ausgabe:
[ 5.08718247 3.51315614 1.4020428 0.21105556]
Beachten Sie, dass dies geringfügig von den Ergebnissen in anderen Sprachen abweicht. Dies liegt daran, dass Pythons Version des Iris-Datensatzes Fehler enthält .
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