Stellen PCA-Komponenten wirklich den Prozentsatz der Varianz dar? Können sie mehr als 100% summieren?

13

O'Reillys "Maschinelles Lernen für Hacker" besagt, dass jede Hauptkomponente einen Prozentsatz der Varianz darstellt. Ich habe den relevanten Teil der folgenden Seite zitiert (Kapitel 8, S.207). Im Gespräch mit einem anderen Experten stimmten sie darin überein, dass es sich um den Prozentsatz handelt.

Die 24 Komponenten summieren sich jedoch auf 133,2095%. Wie kann das sein?

Nachdem wir uns davon überzeugt haben, dass wir PCA verwenden können, wie machen wir das in R? Auch dies ist ein Ort, an dem R leuchtet: Die gesamte PCA kann in einer Codezeile ausgeführt werden. Wir verwenden die Funktion princomp, um PCA auszuführen:

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

Wenn wir nur pca in R eingeben, sehen wir eine kurze Zusammenfassung der Hauptkomponenten:

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

In dieser Zusammenfassung geben die Standardabweichungen an, wie viel Abweichung im Datensatz von den verschiedenen Hauptkomponenten verursacht wird. Die erste Komponente, Comp.1 genannt, macht 29% der Varianz aus, während die nächste Komponente 20% ausmacht. Am Ende macht die letzte Komponente, Comp.24, weniger als 1% der Varianz aus. Dies legt nahe, dass wir viel über unsere Daten lernen können, indem wir uns nur die erste Hauptkomponente ansehen.

[Code und Daten finden Sie auf Github .]

Darren Cook
quelle
6
Ich denke, die Interpretation des Autors Standard deviationsist ein wenig abweichend. Da es sich bei den Standardabweichungen tatsächlich um Standardabweichungen handelt, müssen wir sie quadrieren, um zu sehen, wie viel von der Varianz jede Komponente darstellt. Die erste Komponente würde Prozent der Gesamtvarianz. 100×29.1001249229.10012492++0.43479832
Angenommen, normal
4
Diese Frage ergibt sich leider aus zwei grundlegenden Fehlern: (1) Es fehlt die Überschrift mit der Ankündigung, dass die Zahlen "Standardabweichungen" sind, und sie werden für Abweichungen verwechselt. (2) Es wird davon ausgegangen, dass diese Zahlen Prozente sind, dies ist jedoch nicht der Fall. (Ihre Einheiten sind unabhängig davon, in welcher Währung die Aktien gemessen werden: Veränderung in Dollar oder Prozent pro Jahr oder was auch immer.) Hier gibt es überhaupt keinen Fehler: Der Kommentar von @Max erklärt, wie Prozent der Gesamtvarianz ermittelt werden.
Whuber
1
@whuber Vielleicht hätte ich "Tippfehler" anstelle von "Fehler" verwenden sollen? :-) " Comp.1, macht 29% der Varianz aus " ist falsch und sollte lauten " Comp.1, macht 46% der Varianz aus "
Darren Cook
1
Vielen Dank, Darren: Ich habe falsch verstanden, dass die Verwirrung in dem Buch vorhanden war und ich habe "Fehler" genommen, um auf die RSoftware selbst zu verweisen . Diesen Fehler zu finden, war ein guter Fang (ich hoffe, Sie fanden es lohnend, herauszufinden, was mit PCA wirklich los ist)!
Whuber
5
Ja, das ist zweifellos ein Fehler im Buch. Es gibt einige Stellen, an denen ich Standardabweichungen anstelle von Abweichungen missbraucht habe. (Zum Beispiel gibt es einen Punkt, an dem wir RMSE anstelle von MSE verwenden, um das Quadrat R zu berechnen.) Ich hoffe, wir haben in naher Zukunft Zeit, uns hinzusetzen und diese Art von Fehlern zu korrigieren.
John Myles White

Antworten:

11

Verwenden Sie summary.princompdiese Option , um den "Anteil der Varianz" und den "kumulativen Anteil" anzuzeigen.

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)
Joshua Ulrich
quelle
1
Vielen Dank, Joshua. Die erste Komponente macht also 46% der Varianz aus. Ich werde einen Fehlerbericht an das Buch senden.
Darren Cook
Wie berechnet sich der "Anteil der Varianz"? Die angezeigte Nummer ist 0.4600083. Aber sqrt(pca$sdev[1]/sum(pca$sdev))(ungefähr sqrt(29.1/133.2)) ergibt 0,4673904.
Darren Cook
3
@ DarrenCook: sdevimpliziert, dass Sie die Standardabweichung betrachten , dh die Quadratwurzel der Varianz (oder unter Verwendung der Notation aus meiner Antwort), die den Unterschied erklären sollte. Versuchen Sie esstattdessen. λipca$sdev[1]^2/sum(pca$sdev^2)
MånsT
2
@DarrenCook: benutze die Quelle ... stats:::print.summary.princompzeigt dir, dass sie die sdevKomponente quadriert , die stats:::princomp.defaultdie sqrtder Eigenwerte darstellt.
Joshua Ulrich
11

Sie sollten zu 100 % summieren .100 %.

Die Gesamtvarianz eines -variate Zufallsvariable X mit Kovarianzmatrix Σ ist definiert als t r ( Σ ) = σ 11 + σ 22 + + σ p p .pXΣ

tr(Σ)=σ11+σ22++σpp.

λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

eiXeii1λi

Var(eiX)=eiΣei=λieiei=λi
k
(λ1++λkλ1++λp100) %
100 %k=p
MånsT
quelle
1
Hast du den (neueren) Kommentar von @Max zu der Frage gesehen? Er brachte die Antwort auf den Punkt.
Whuber
@whuber: Ich hatte es nicht gesehen, also danke. Ich habe eine ähnliche Bemerkung in einem Kommentar zu Joshuas Antwort gemacht.
MånsT
4

Hier ist ein R-Code, der die vorherigen Antworten ergänzt ( pca[["sdev"]]wird normalerweise geschrieben pca$sdev, führt jedoch zu einer falschen Formatierung im folgenden Codeausschnitt).

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

Wie @Max hervorhebt, ist das Problem gelöst, wenn Sie anstelle der Standardabweichung mit der Varianz arbeiten und nicht vergessen, durch die Gesamtvarianz zu dividieren.

gui11aume
quelle