Wie kann man PCA umkehren und Originalvariablen aus mehreren Hauptkomponenten rekonstruieren?

113

Die Hauptkomponentenanalyse (PCA) kann zur Dimensionsreduzierung verwendet werden. Wie kann man nach einer solchen Dimensionsreduktion die ursprünglichen Variablen / Merkmale aus einer kleinen Anzahl von Hauptkomponenten näherungsweise rekonstruieren?

Wie kann man alternativ mehrere Hauptkomponenten aus den Daten entfernen oder verwerfen?

Mit anderen Worten, wie PCA umkehren?


Angesichts der Tatsache, dass PCA in enger Beziehung zur Singularwertzerlegung (SVD) steht, kann dieselbe Frage wie folgt gestellt werden: Wie kann die SVD umgekehrt werden?

Amöbe
quelle
10
Ich poste diesen Q & A-Thread, weil ich es leid bin, Dutzende von Fragen zu sehen, die genau dies fragen, und sie nicht als Duplikate schließen zu können, weil wir keinen kanonischen Thread zu diesem Thema haben. Es gibt mehrere ähnliche Themen mit anständigen Antworten , aber alle scheinen ernsthafte Einschränkungen zu haben, wie zB ausschließlich auf R. Fokussierung
Amöbe
4
Ich weiß den Aufwand zu schätzen - ich denke, es ist dringend erforderlich, Informationen über PCA, deren Funktion und Nichtfunktion in einem oder mehreren hochwertigen Threads zusammenzufassen. Ich bin froh, dass Sie es auf sich genommen haben, dies zu tun!
Sycorax
1
Ich bin nicht davon überzeugt, dass diese kanonische Antwort "Aufräumen" ihren Zweck erfüllt. Was wir hier haben, ist eine ausgezeichnete, allgemeine Frage und Antwort, aber jede der Fragen hatte einige Feinheiten in Bezug auf PCA in der Praxis, die hier verloren gehen. Im Grunde genommen haben Sie alle Fragen beantwortet, PCA durchgeführt und die unteren Hauptkomponenten verworfen, in denen manchmal wichtige Details verborgen sind. Darüber hinaus haben Sie zurück Lineare Algebra Notation Lehrbuch , das ist genau das, was für viele Menschen PCA undurchsichtig macht, anstatt die lingua franca der Casual Statistiker mit, die R. ist
Thomas Browne
1
@ Thomas Danke. Ich denke, wir haben eine Meinungsverschiedenheit, gerne diskutieren wir darüber im Chat oder in Meta. Ganz kurz: (1) Es ist zwar besser, jede Frage einzeln zu beantworten, aber die harte Realität ist, dass dies nicht der Fall ist. Viele Fragen bleiben einfach unbeantwortet, wie es wahrscheinlich bei Ihnen der Fall gewesen wäre. (2) Die Community bevorzugt nachdrücklich generische Antworten, die für viele Menschen nützlich sind. Sie können sehen, welche Art von Antworten am häufigsten bewertet wird. (3) In Mathe einverstanden sein, aber deshalb habe ich hier R-Code angegeben! (4) In Bezug auf die Verkehrssprache nicht einverstanden sein; persönlich weiß ich nicht R.
Amöbe
@amoeba Ich fürchte, ich weiß nicht, wie ich den besagten Chat finden kann, da ich noch nie an Metadiskussionen teilgenommen habe.
Thomas Browne

Antworten:

147

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:

Bildbeschreibung hier eingeben

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 :pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+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.XVVpVV

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

Zwei Graustufenversionen des Lenna-Bildes.  Die rechte ist körnig, aber eindeutig erkennbar.

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=USVkzUkpS1: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  
Amöbe
quelle
1
In MATLAB können Sie mu von den Standard-PCA-Ausgängen abrufen und die Anzahl der Komponenten in den Eingängen angeben.
Aksakal
2
@Aksakal Ich habe versucht, alle drei Code-Auszüge so ähnlich (und klar wie möglich) zu gestalten. Insbesondere wollte ich von Hand berechnen, bevor ich pca () aufrief, und PCA mit allen Komponenten ausführen und nur Komponenten verwenden, wenn ich ein Skalarprodukt zwischen Scores und Eigenvektoren durchführe. Ich habe jetzt den Python-Code geändert, um dem gleichen Muster zu folgen. μnComp
Amöbe
3
Ich würde alles aus der Antwort entfernen, was nicht mit der direkten Antwort auf die Frage zu tun hat, wie zum Beispiel das Bild dieses süßen Mädchens und die Bildverarbeitung. Wenn sich jemand nicht für Bilder interessiert, erschwert dies den Verbrauch. Denken Sie daran, dass jeder, der die Frage stellt, bereits zutiefst verwirrt ist.
Aksakal
5
Lenna ist in etwa ein Standarddatensatz wie Iris.
StasK
2
@amoeba Ich sprach über Größe, Bittiefe, sogar schwarze Pixel im Rand. Ich habe keine definitive Version http://www.ece.rice.edu/~wakin/images/ : "Es scheinen viele Versionen des Lena-Testbildes (auch bekannt als" Lenna ") verfügbar zu sein. Dieses Problem wurde von Shapiro festgestellt in seiner Null-Baum-Arbeit von 1993, und es ist heute überraschend wahr "
Laurent Duval