In dieser Frage geht es um eine effiziente Methode zur Berechnung von Hauptkomponenten.
Viele Texte zur linearen PCA befürworten die Verwendung der Singulärwertzerlegung der fallweisen Daten . Das heißt, wenn wir Daten und wollen die Variablen (seine ersetzen Spalten ) von Hauptkomponenten, wir tun SVD: X = U S V ' (. Sq Wurzeln des Eigenwerts), singuläre Werte die Hauptdiagonale von Besatzungs S , rechte Eigenvektoren V sind die orthogonale Rotationsmatrix von Achsenvariablen in Achsenkomponenten, linke Eigenvektoren U sind wie V , nur für Fälle. Wir können dann Komponentenwerte berechnen als C = X V = U S.
Eine andere Möglichkeit, eine PCA von Variablen durchzuführen, besteht in der Zerlegung der quadratischen Matrix (dh R kann Korrelationen oder Kovarianzen usw. zwischen den Variablen sein). Die Zerlegung kann eine Eigenzerlegung oder eine Singulärwertzerlegung sein: Bei einer quadratischen symmetrischen positiven semidefiniten Matrix ergeben sie dasselbe Ergebnis R = V L V ' mit Eigenwerten als Diagonale von L und V wie zuvor beschrieben. Komponentenwerte werden C = X V .
Nun meine Frage: Wenn Daten eine große Matrix sind und die Anzahl der Fälle (was häufig der Fall ist) viel größer als die Anzahl der Variablen ist, wird erwartet, dass Weg (1) viel langsamer ist als Weg (2), weil way (1) einen recht teuren Algorithmus (wie SVD) auf eine große Matrix anwendet; es berechnet und speichert eine riesige Matrix U, die wir in unserem Fall wirklich nicht brauchen (die PCA von Variablen). Wenn ja, warum sprechen sich dann so viele Lehrbücher dafür aus oder erwähnen nur so (1)? Vielleicht ist es ist effizient und ich bin etwas fehlt?
quelle
R
svd
Joliffe, Principal component analysis, 2nd ed.
Eigentlich beschreibt Joliffe beide Möglichkeiten, aber im Kernkapitel über PCA sagt er, soweit ich mich erinnern kann, nur über Weg 1.Antworten:
Hier sind meine 2ct zum Thema
Die Vorlesung über Chemometrie, in der ich PCA zum ersten Mal lernte, verwendete Lösung (2), war jedoch nicht numerisch orientiert, und meine Vorlesung über Numerik war nur eine Einführung und behandelte SVD nicht, soweit ich mich erinnere.
Wenn ich Holmes: Schnelle SVD für Großmatrizen richtig verstehe , wurde Ihre Idee verwendet, um eine rechnerisch schnelle SVD für Langmatrizen zu erhalten.
Das würde bedeuten, dass eine gute SVD-Implementierung intern folgen könnte (2), wenn sie auf geeignete Matrizen stößt (ich weiß nicht, ob es noch bessere Möglichkeiten gibt). Dies würde bedeuten, dass es für eine Implementierung auf hoher Ebene besser ist, die SVD (1) zu verwenden und sie dem BLAS zu überlassen, um zu prüfen, welcher Algorithmus intern verwendet werden soll.
Schneller Praxistest: OpenBLAS 'svd scheint diese Unterscheidung nicht zu treffen. Auf einer Matrix von 5e4 x 100
svd (X, nu = 0)
dauert es durchschnittlich 3,5 s, während essvd (crossprod (X), nu = 0)
54 ms dauert (von R mit aufgerufenmicrobenchmark
).Die Quadratur der Eigenwerte ist natürlich schnell, und bis dahin sind die Ergebnisse beider Aufrufe gleichwertig.
Update: Schauen Sie sich Wu, W. an; Massart, D. & de Jong, S .: Die Kernel-PCA-Algorithmen für breite Daten. Teil I: Theorie und Algorithmen, Chemometrie und intelligente Laborsysteme, 36, 165 - 172 (1997). DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5
In diesem Artikel werden numerische und rechnerische Eigenschaften von 4 verschiedenen Algorithmen für PCA erörtert: SVD, Eigenzerlegung (EVD), NIPALS und POWER.
Sie hängen wie folgt zusammen:
Der Kontext des Papiers sind X breit , und sie arbeiten auf X X ' (KernelPCA) - das ist genau das Gegenteil Situation wie die Sie fragen. Um also Ihre Frage zum Langmatrixverhalten zu beantworten, müssen Sie die Bedeutung von "Kernel" und "Klassik" austauschen.X(30×500) XX′
Es ist nicht überraschend, dass EVD und SVD die Plätze wechseln, je nachdem, ob der klassische oder der Kernel-Algorithmus verwendet wird. Im Zusammenhang mit dieser Frage bedeutet dies, dass das eine oder andere je nach Form der Matrix besser sein kann.
Aber aus ihrer Diskussion über "klassische" SVD und EVD geht hervor, dass die Zersetzung vonX′X
svd ()
quelle
svd (X'X)
für lange Matrizen.)microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)
interessant sein.SVD ist langsamer, wird jedoch aufgrund der höheren numerischen Genauigkeit häufig als bevorzugte Methode angesehen.
Hier ist , was in dem von MATLAB geschrieben
pca()
Funktion Hilfe :Der letzte Satz unterstreicht den entscheidenden Kompromiss zwischen Geschwindigkeit und Genauigkeit, der hier zum Tragen kommt.
Der schnellste Weg führt in diesem Fall über die Kovarianzmatrix (dritte Zeile). Natürlich, wennn ≪ p X X⊤
identische Ergebnisse erhalten:
Aber jetzt nehmenϵ = 10- 10 wenn wir , können wir beobachten, wie SVD immer noch gut abschneidet, aber EIG zusammenbricht:
Was hier passiert, ist, dass die Berechnung der Kovarianzmatrix die Bedingungszahl von quadriertX , also vor allem für den Fall, wenn X Bei einigen nahezu kollinearen Spalten (dh bei einigen sehr kleinen Singularwerten) führt die Berechnung der Kovarianzmatrix und die anschließende Berechnung der Zerlegung zu einem Genauigkeitsverlust im Vergleich zur direkten SVD.
Ich sollte hinzufügen, dass man diesen möglichen [winzigen] Präzisionsverlust oftmals gerne ignoriert und lieber die schnellere Methode anwendet.
quelle
eig()
Annäherung leidet ? (Die Leser werden davon profitieren: Es gibt einen Kompromiss zwischen Geschwindigkeit und Stabilität. Wie kann man in einer konkreten praktischen Situation entscheiden?)3 0 -3.3307e-16
eigen in spss wurde ich zurückgegeben3 0 0
. Es sieht so aus, als ob die Funktion einen eingebauten und festen Toleranzwert hat, ab dem sie nullt. In diesem Beispiel schien die Funktion den Knoten der numerischen Instabilität zu hacken, indem beide winzigen Eigenwerte, die "0" und die "-16", auf Null gesetzt wurden.