Zum Hauptinhalt springen

2.3 Eigenschaften der PCA

Projektion auf die Hauptkomponenten​

📄 03_dimred.pdf, Folie 26

Die Folie (aus Hastie et al.) zeigt die Projektion in 2D: Jeder Punkt xi\mathbf x_i wird senkrecht auf die erste Hauptkomponente v1v_1 gefällt. Die Länge vom Ursprung bis zum Fußpunkt ist der Score a1a_1 (im Buch als ui1d1u_{i1}d_1 geschrieben, das ist die SVD-Schreibweise, siehe unten). Die gestrichelten Lote sind das, was bei der Reduktion auf eine Dimension verloren geht.

📄 03_dimred.pdf, Folie 27 zeigt dasselbe für beide Komponenten: zwei Punktwolken in 2D, und an den Achsen 1 und 2 die Histogramme der Projektionen a1a_1 und a2a_2. Entlang der ersten Achse ist die Verteilung breit und zweigipflig (beide Gruppen sind getrennt sichtbar), entlang der zweiten schmal.

📄 03_dimred.pdf, Folie 28: In 3D spannen die ersten beiden Hauptkomponenten eine Ebene auf, die möglichst gut durch die Punktwolke passt. Die Punkte werden senkrecht auf diese Ebene projiziert, und man kann sie dann als 2D-Streudiagramm mit den Achsen „First / Second principal component“ darstellen.

Dimensionsreduktion: Kodieren und Dekodieren​

📄 03_dimred.pdf, Folie 30

Prinzip: Die Hauptkomponenten werden nach ihrer Varianz absteigend geordnet. Man behält die ℓ\ell Komponenten mit der größten Varianz und verwirft die übrigen n−ℓn-\ell.

Kodierungsschritt (encoder): Die Daten werden in den Unterraum der ℓ\ell größten Varianzen projiziert:

x ⟶ ai=qi⊤x,i=1…ℓ.\mathbf x\ \longrightarrow\ a_i=\mathbf q_i^\top\mathbf x,\qquad i=1\dots\ell.

In Matrixform: a=Qℓ⊤x\mathbf a=Q_\ell^\top\mathbf x, wobei Qℓ=[q1,…,qℓ]Q_\ell=[\mathbf q_1,\dots,\mathbf q_\ell] die n×ℓn\times\ell-Matrix der ersten ℓ\ell Eigenvektoren ist. Aus nn Zahlen werden ℓ\ell Zahlen.

Dekodierungsschritt (decoder): Rekonstruktion aus den Projektionen

x^=∑i=1ℓaiqi=Qℓ a.\hat{\mathbf x}=\sum_{i=1}^{\ell}a_i\mathbf q_i = Q_\ell\,\mathbf a.
EingabeOperationAusgabe
Encoderx∈Rn\mathbf x\in\mathbb R^nMatrix mit Zeilen q1⊤,…,qℓ⊤\mathbf q_1^\top,\dots,\mathbf q_\ell^\topScores a1,…,aℓa_1,\dots,a_\ell
DecoderScores a1,…,aℓa_1,\dots,a_\ellMatrix mit Spalten q1,…,qℓ\mathbf q_1,\dots,\mathbf q_\ellx^∈Rn\hat{\mathbf x}\in\mathbb R^n

Ergänzung: Diese Encoder-Decoder-Struktur ist ein linearer Autoencoder. Ein neuronaler Autoencoder mit linearen Aktivierungen und quadratischem Fehler lernt genau den PCA-Unterraum. Bei nicht zentrierten Daten addiert man im Decoder den Mittelwert wieder: x^=μ+Qℓ Qℓ⊤(x−μ)\hat{\mathbf x}=\boldsymbol\mu+Q_\ell\,Q_\ell^\top(\mathbf x-\boldsymbol\mu).

Die PCA-Rekonstruktion ist optimal​

📄 03_dimred.pdf, Folie 31

Aussage: Von allen Orthonormalbasen eines ℓ\ell-dimensionalen Unterraums ist die PCA-Basis optimal in dem Sinne, dass sie den mittleren quadratischen Rekonstruktionsfehler minimiert.

Behält man alle Hauptkomponenten, ist die Rekonstruktion exakt:

x=∑i=1naiqi.\mathbf x=\sum_{i=1}^{n}a_i\mathbf q_i.

Bei ℓ<n\ell<n Komponenten ist sie nur eine Näherung:

x^=∑i=1ℓaiqi.\hat{\mathbf x}=\sum_{i=1}^{\ell}a_i\mathbf q_i.

Mittlerer quadratischer Fehler:

E[∥x−x^∥2]=E[∥∑i=ℓ+1naiqi∥2]=∑i=ℓ+1nE[ai2]=∑i=ℓ+1nσi′2=∑i=ℓ+1nβi.\mathcal E\big[\lVert\mathbf x-\hat{\mathbf x}\rVert^2\big] =\mathcal E\Big[\Big\lVert\sum_{i=\ell+1}^{n}a_i\mathbf q_i\Big\rVert^2\Big] =\sum_{i=\ell+1}^{n}\mathcal E[a_i^2] =\sum_{i=\ell+1}^{n}\sigma_{i'}^2 =\sum_{i=\ell+1}^{n}\beta_i.

Schritt für Schritt:

  1. x−x^\mathbf x-\hat{\mathbf x}: Die ersten ℓ\ell Summanden kürzen sich weg, übrig bleiben die weggelassenen Komponenten i=ℓ+1,…,ni=\ell+1,\dots,n.
  2. Quadrierte Norm ausmultiplizieren: ∥∑iaiqi∥2=∑i∑jaiaj qi⊤qj\lVert\sum_i a_i\mathbf q_i\rVert^2=\sum_i\sum_j a_ia_j\,\mathbf q_i^\top\mathbf q_j. Wegen der Orthonormalität ist qi⊤qj=1\mathbf q_i^\top\mathbf q_j=1 für i=ji=j, sonst 0. Es bleibt ∑iai2\sum_i a_i^2 (Satz des Pythagoras in nn Dimensionen).
  3. E[ai2]\mathcal E[a_i^2] ist die Varianz des ii-ten Scores, also βi\beta_i.

Der Fehler ist die Summe der weggelassenen Eigenwerte. Lässt man die kleinsten weg, wird er minimal. Die Folie: „Der Fehler jeder anderen Variablenkombination wäre größer!“

Ergänzung, warum keine andere Basis besser ist: Für eine beliebige Orthonormalbasis u1,…,uℓ\mathbf u_1,\dots,\mathbf u_\ell ist der Fehler tr⁡Σ−∑i=1ℓui⊤Σui\operatorname{tr}\Sigma-\sum_{i=1}^\ell\mathbf u_i^\top\Sigma\mathbf u_i. Minimaler Fehler heißt maximale erhaltene Varianz ∑ui⊤Σui\sum\mathbf u_i^\top\Sigma\mathbf u_i, und die wird nach dem Optimierungsargument aus 2.2 von den Eigenvektoren zu den größten Eigenwerten erreicht. Maximale Varianz und minimaler Rekonstruktionsfehler sind also zwei Sichtweisen desselben Problems.

Zahlenbeispiel (Fortsetzung aus 2.2, β1=4.5\beta_1=4.5, β2=0.5\beta_2=0.5, ℓ=1\ell=1): Der Punkt x=(2,1)⊤\mathbf x=(2,1)^\top hat a1=3/2a_1=3/\sqrt2. Rekonstruktion:

x^=a1q1=32⋅12(11)=(1.51.5),∥x−x^∥2=0.52+0.52=0.5.\hat{\mathbf x}=a_1\mathbf q_1=\frac3{\sqrt2}\cdot\frac1{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix}=\begin{pmatrix}1.5\\1.5\end{pmatrix},\qquad \lVert\mathbf x-\hat{\mathbf x}\rVert^2=0.5^2+0.5^2=0.5.

Für alle vier Punkte ist der Fehler 0.5, im Mittel also 0.5=β20.5=\beta_2 ✔. Zum Vergleich: Würde man stattdessen einfach die Koordinate x1x_1 behalten (Merkmalsselektion), wäre der mittlere Fehler σ22=2.5\sigma_2^2=2.5, fünfmal so groß.

Wie viele Hauptkomponenten braucht man?​

📄 03_dimred.pdf, Folie 32

Die Gesamtvarianz ändert sich durch die Rotation nicht:

σges2=∑i=1nσ2(xi)=∑i=1nσ2(ai)=∑i=1nβi.\sigma_{\text{ges}}^2=\sum_{i=1}^n\sigma^2(x_i)=\sum_{i=1}^n\sigma^2(a_i)=\sum_{i=1}^n\beta_i.

Ergänzung, warum: ∑iσ2(xi)\sum_i\sigma^2(x_i) ist die Spur von Σ\Sigma, und die Spur ist die Summe der Eigenwerte. Anschaulich: Eine Drehung ändert keine Abstände, also auch nicht den mittleren quadratischen Abstand zum Schwerpunkt.

Als Gütekriterium für die Approximation durch die ersten ℓ\ell Hauptkomponenten dient die erklärte Varianz (explained variance):

Pℓ=∑i=1ℓσ2(ai)σges2=∑i=1ℓβi∑i=1nβi.P_\ell=\frac{\sum_{i=1}^{\ell}\sigma^2(a_i)}{\sigma_{\text{ges}}^2}=\frac{\sum_{i=1}^{\ell}\beta_i}{\sum_{i=1}^{n}\beta_i}.

(Auf der Folie steht PkP_k mit Summe bis ℓ\ell, gemeint ist dasselbe.)

Faustregel

Die ersten ℓ\ell Hauptkomponenten sollten ca. 80 % der Gesamtvarianz erklären.

Die Grafik auf der Folie trägt PℓP_\ell gegen ℓ\ell auf (cumulative proportion of variance). Die Kurve steigt anfangs steil und flacht dann ab. Im Beispiel wird die 80-%-Linie bei 4 Komponenten überschritten.

Beispiel: erklärte Varianz​

📄 03_dimred.pdf, Folie 33

Zwei kleine 2D-Datensätze mit je vier Punkten:

Varianzen β1,β2\beta_1,\beta_2erklärte VarianzDeutung
Datensatz 14.40, 0.174.40,\ 0.174.40/4.57≈96 %4.40/4.57\approx96\,\% und 4 %4\,\%Punkte liegen fast auf einer Geraden. Die erste Komponente erklärt die Daten schon sehr gut
Datensatz 24.14, 1.444.14,\ 1.4474 %74\,\% und 26 %26\,\%Die erste Komponente allein reicht vermutlich nicht

Im eigenen Beispiel aus 2.2: 4.5/5=90 %4.5/5=90\,\%.

Fallstrick: Skalierung

Ergänzung: Die PCA ist nicht skaleninvariant. Misst man eine Variable in Millimetern statt Metern, wächst ihre Varianz um den Faktor 10610^6, und sie dominiert die erste Hauptkomponente. Haben die Variablen unterschiedliche Einheiten, standardisiert man sie vorher (Mittelwert 0, Varianz 1). Das entspricht einer PCA auf der Korrelationsmatrix. Bei Pixeln mit gleicher Skala ist das nicht nötig.

Beispiele​

Handgeschriebene Ziffern​

📄 03_dimred.pdf, Folie 34 zeigt viele handgeschriebene Dreien. Auf 📄 03_dimred.pdf, Folie 35 ist jede Drei als Punkt im Raum der ersten beiden Hauptkomponenten-Scores dargestellt. Rechts sind Beispielbilder zu einem Gitter von Score-Werten zu sehen (rote Kreise links). Die Deutung der Achsen steht nicht auf der Folie, sondern stammt aus der Quelle des Beispiels (Hastie et al.):

  • Entlang der ersten Hauptkomponente (horizontal) ändert sich vor allem die Länge des unteren Bogens, die Drei wird nach rechts hin ausladender.
  • Entlang der zweiten (vertikal) ändert sich vor allem die Strichdicke bzw. Neigung.

Die Hauptkomponenten entsprechen hier also anschaulichen Variationen der Schreibweise. Man kann jede Drei grob durch zwei Zahlen beschreiben.

Gesichter​

📄 03_dimred.pdf, Folie 36: Gesichtsbilder mit 48×48=230448\times48=2304 Pixeln werden auf die ersten zwei Hauptkomponenten (PC1, PC2) projiziert. Bilder derselben Person bilden erkennbare Gruppen (Farben). Ähnliche Aufnahmen landen nah beieinander.

Die Eigenvektoren lassen sich hier wieder als Bilder darstellen, die Eigengesichter (eigenfaces). Genau das ist die Aufgabe „Eigengesichter“ im Praktikum (Arbeitsblatt 2): Bilder in Vektoren umformen („stacken“), PCA auf der Designmatrix, die ersten Eigengesichter darstellen und Testbilder per nächstem Nachbarn im Raum der ersten Scores einer Person zuordnen.

Grenzen: PCA bei drei Clustern​

📄 03_dimred.pdf, Folie 37

Drei Cluster in 2D, eingefärbt nach dem Wert der ersten bzw. zweiten Hauptkomponente. Die erste Hauptkomponente verläuft so, dass zwei der Cluster ähnliche Scores bekommen, sie werden in der Projektion nicht sauber getrennt.

Die PCA ist kein Clusterverfahren

Die PCA maximiert die Varianz, nicht die Trennbarkeit von Gruppen. Sie kennt weder Labels noch Cluster. Die Richtung größter Varianz kann zufällig die Gruppen trennen (wie bei 📄 03_dimred.pdf, Folie 27), muss es aber nicht. Außerdem findet sie nur lineare Unterräume, gekrümmte Strukturen erfasst sie nicht. Um Gruppen zu finden, braucht man ein Clusterverfahren, siehe 2.4.

Der PCA-Algorithmus in der Praxis​

Ergänzung, nicht auf den Folien als Algorithmus zusammengefasst.

Gegeben sei eine Datenmatrix XX mit NN Zeilen (Datenpunkte) und nn Spalten (Variablen).

  1. Zentrieren: μ^=1N∑kxk\hat{\boldsymbol\mu}=\frac1N\sum_k\mathbf x_k berechnen und von jeder Zeile abziehen, das ergibt XcX_c.
  2. Kovarianzmatrix: Σ^=1NXc⊤Xc\hat\Sigma=\frac1N X_c^\top X_c (Größe n×nn\times n).
  3. Eigenzerlegung von Σ^\hat\Sigma, Eigenwerte absteigend sortieren, Eigenvektoren entsprechend.
  4. ℓ\ell wählen, z.B. kleinstes ℓ\ell mit Pℓ≥0.8P_\ell\ge0.8.
  5. Scores: A=XcQℓA=X_cQ_\ell (N×ℓN\times\ell).
import numpy as np

def pca(X, l):
mu = X.mean(axis=0)
Xc = X - mu # 1. zentrieren
Sigma = Xc.T @ Xc / len(X) # 2. Kovarianzmatrix
beta, Q = np.linalg.eigh(Sigma) # 3. eigh: für symmetrische Matrizen
order = np.argsort(beta)[::-1] # aufsteigend -> absteigend
beta, Q = beta[order], Q[:, order]
A = Xc @ Q[:, :l] # 5. Scores
return mu, Q[:, :l], beta, A

X = np.array([[2, 1], [1, 2], [-1, -2], [-2, -1]], float)
mu, Ql, beta, A = pca(X, 1)
print(beta) # [4.5 0.5]
print(beta[0] / beta.sum()) # 0.9
X_hat = mu + A @ Ql.T # Rekonstruktion

Hinweise:

  • Das Vorzeichen eines Eigenvektors ist beliebig (−q-\mathbf q ist auch ein Eigenvektor). Verschiedene Bibliotheken können also gespiegelte Scores liefern.
  • Bei Bildern ist nn groß (z.B. 2304), die n×nn\times n-Kovarianzmatrix wird teuer. Dann rechnet man besser die Singulärwertzerlegung Xc=UDV⊤X_c=UDV^\top: Die Spalten von VV sind die Hauptkomponenten, βi=di2/N\beta_i=d_i^2/N, und die Scores sind UDUD (daher ui1d1u_{i1}d_1 auf 📄 03_dimred.pdf, Folie 26).
  • In scikit-learn: sklearn.decomposition.PCA(n_components=l), das Attribut explained_variance_ratio_ liefert die Anteile βi/∑βj\beta_i/\sum\beta_j.