Sie sollten die Daten normalisieren, bevor Sie PCA ausführen. Betrachten Sie beispielsweise die folgende Situation. Ich schaffe eine Daten X
mit einer bekannten Korrelationsmatrix C
:
>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;
Wenn ich jetzt PCA durchzuführen, I korrekt feststellen, dass die Hauptkomponenten (die Zeilen der Gewichte Vektor) in einem Winkel zu den Koordinatenachsen ausgerichtet sind, :
>> wts=pca(X)
wts =
0.6659 0.7461
-0.7461 0.6659
Wenn ich 100 das erste Merkmal des Datensatzes nun skalieren, intuitiv denken wir, dass die Hauptkomponenten nicht ändern sollte:
>> Y = X;
>> Y(:,1) = 100 * Y(:,1);
Allerdings haben wir jetzt feststellen, dass die Hauptkomponenten mit den Koordinatenachsen ausgerichtet sind:
>> wts=pca(Y)
wts =
1.0000 0.0056
-0.0056 1.0000
Um dies zu beheben, gibt es zwei Möglichkeiten. Zuerst konnte ich die Daten neu zu skalieren:
>> Ynorm = bsxfun(@rdivide,Y,std(Y))
(Die seltsame bsxfun
Schreibweise verwendet wird Vektor-Matrix-Arithmetik in Matlab zu tun - alles, was ich tue, ist der Mittelwert subtrahiert und durch die Standardabweichung der einzelnen Merkmalsteilung) .
Wir bekommen jetzt vernünftige Ergebnisse von PCA:
>> wts = pca(Ynorm)
wts =
-0.7125 -0.7016
0.7016 -0.7125
Sie auf das PCA auf den ursprünglichen Daten etwas anders sind, weil wir jetzt garantiert haben, dass unsere Eigenschaften Einheit Standardabweichung haben, was nicht der war ursprünglicher Fall.
Die andere Option ist PCA unter Verwendung der Korrelationsmatrix der Daten durchzuführen, anstelle des äußeren Produkts:
>> wts = pca(Y,'corr')
wts =
0.7071 0.7071
-0.7071 0.7071
In der Tat, dies zu standardisieren das Datum völlig äquivalent ist, indem der Mittelwert subtrahiert wird, und dann Dividieren durch die Standardabweichung. Es ist einfach bequemer. Meiner Meinung nach sollten Sie immer dies tun, es sei denn, Sie haben einen guten Grund nicht (z. B. wenn Sie wollen Unterschiede in der Variation von jedem Merkmal aufnehmen).