Ich studiere PCA von Andrew Ngs Coursera-Kurs und anderen Materialien. In der ersten Aufgabe des Stanford NLP-Kurses cs224n und im Vorlesungsvideo von Andrew Ng wird anstelle der Eigenvektorzerlegung der Kovarianzmatrix eine Singulärwertzerlegung durchgeführt, und Ng sagt sogar, dass SVD numerisch stabiler ist als eigendecomposition.
Nach meinem Verständnis sollten wir für PCA eine SVD der Datenmatrix der (m,n)
Größe durchführen, nicht der Kovarianzmatrix der (n,n)
Größe. Und Eigenvektorzerlegung der Kovarianzmatrix.
Warum machen sie SVD der Kovarianzmatrix, nicht der Datenmatrix?
pca
linear-algebra
svd
eigenvalues
numerics
DongukJu
quelle
quelle
x=randn(10000); x=x'*x; tic; eig(x); toc; tic; svd(x); toc;
auf meinem Computer werden 12s für eig () und 26s für svd () ausgegeben. Wenn es so viel langsamer ist, muss es zumindest stabiler sein! :-)eig
oder Verwendungsvd
der Kovarianzmatrix, aber meines Wissens gibt es keinen großen Unterschied zwischen der Verwendungeig
oder Verwendungsvd
der Kovarianzmatrix beide abwärtsstabilen Algorithmen. Wenn überhaupt, würde ich mein Geld auf eig sein setze mehr stabil, da es weniger Berechnungen durchführt (vorausgesetzt , beide mit state-of-the-art Algorithmen implementiert sind).Antworten:
Amöbe gab bereits eine gute Antwort in den Kommentaren, aber wenn Sie ein formelles Argument wollen, hier geht es.
Die Singularwertzerlegung einer Matrix ist , wobei die Spalten von Eigenvektoren von und die diagonalen Einträge von die Quadratwurzeln ihrer Eigenwerte sind, dh .A = U ≤ V T V A T A ≤ σ i i = √EIN A = UΣ VT V EINTEIN Σ σich ich= λich( ATA )-------√
Wie Sie wissen, sind die Hauptkomponenten die orthogonalen Projektionen Ihrer Variablen auf den Raum der Eigenvektoren der empirischen Kovarianzmatrix . Die Varianz der Komponenten ergibt sich aus ihren Eigenwerten .λi(11n - 1EINTEIN λich( 1n - 1EINTA )
Betrachte eine beliebige quadratische Matrix , und einen Vektor so dass . Dannα ∈ R v B v = λ vB α∈R v Bv=λv
Definieren wir . Die SVD von berechnet die eigendezusammensetzung von zu ergebenSSTS=1S=1n−1ATA S STS=1(n−1)2ATAATA
Voilà!
In Bezug auf die numerische Stabilität müsste man herausfinden, welche Algorithmen verwendet werden. Wenn Sie dazu bereit sind, glaube ich, dass dies die von numpy verwendeten LAPACK-Routinen sind:
Update: In Bezug auf die Stabilität scheint die SVD-Implementierung einen Divide-and-Conquer-Ansatz zu verwenden, während die eigendecomposition einen einfachen QR-Algorithmus verwendet. Ich kann nicht auf einige relevante SIAM-Papiere meiner Institution zugreifen (Kürzungen bei der Schuldforschung), aber ich habe etwas gefunden, das die Einschätzung unterstützen könnte, dass die SVD-Routine stabiler ist.
Im
Sie vergleichen die Stabilität verschiedener Eigenwertalgorithmen, und es scheint, dass der Divide-and-Conquer-Ansatz (sie verwenden denselben Ansatz wie Numpy in einem der Experimente!) stabiler ist als der QR-Algorithmus. Dies, zusammen mit den Behauptungen an anderer Stelle, dass D & C-Methoden tatsächlich stabiler sind, stützt Ngs Wahl.
quelle
@amoeba hatte ausgezeichnete Antworten auf PCA Fragen, darunter diese auf Bezug von SVD zu PCA. Bei der Beantwortung Ihrer genauen Frage werde ich drei Punkte ansprechen:
Es stellt sich heraus, dass SVD insbesondere für maschinelles Lernen stabiler ist als typische Verfahren zur Zerlegung von Eigenwerten. Beim maschinellen Lernen kommt es leicht zu hochkollinearen Regressoren. SVD funktioniert in diesen Fällen besser.
Hier ist Python-Code, um den Punkt zu demonstrieren. Ich habe eine hochkollineare Datenmatrix erstellt, ihre Kovarianzmatrix erhalten und versucht, deren Eigenwerte zu ermitteln. SVD funktioniert immer noch, während die gewöhnliche Eigenzerlegung in diesem Fall fehlschlägt.
Ausgabe:
Aktualisieren
Als Antwort auf Federico Polonis Kommentar hier der Code mit Stabilitätsprüfungen von SVD gegen Eig an 1000 Zufallsstichproben derselben Matrix oben. In vielen Fällen zeigt Eig einen kleinen Eigenwert von 0 an, was zur Singularität der Matrix führen würde, und SVD tut dies hier nicht. SVD ist bei einer kleinen Eigenwertbestimmung etwa doppelt so genau, was je nach Problem möglicherweise wichtig ist oder nicht.
Ausgabe:
Hier Code funktioniert der Code. Anstatt die zufällige Kovarianzmatrix zum Testen der Routinen zu generieren, generiere ich die zufällige Datenmatrix mit zwei Variablen: wobei - unabhängige einheitliche Zufallsvariablen. Die Kovarianzmatrix lautet also wobei - Varianzen der Uniformen und der Korrelationskoeffizienten zwischen Sie.u , v ( σ 2 1 σ 2 1 + ε & rgr; σ 1 σ 2 σ 2 1 + ε & rgr; σ 1 σ 2 σ 2 1 + 2 ε & rgr; σ 1
Sein kleinster Eigenwert: Der kleine Eigenwert kann nicht durch einfaches Einstecken des in die Formel berechnet werden, da die Genauigkeit begrenzt ist. Sie müssen ihn also erweitern:
Ich führe Simulationen der Realisierungen der Datenmatrix aus, berechne die Eigenwerte der simulierten Kovarianzmatrix und die Fehler .λ j e j = λ - λ jj=1,…,m λ^j ej=λ−λ^j
quelle
Für Python-Benutzer möchte ich darauf hinweisen, dass es für symmetrische Matrizen (wie die Kovarianzmatrix) besser ist,
numpy.linalg.eigh
Funktion anstelle einer allgemeinennumpy.linalg.eig
Funktion zu verwenden.eigh
ist 9-10 mal schneller alseig
auf meinem Computer (unabhängig von der Matrixgröße) und hat eine bessere Genauigkeit (basierend auf dem Genauigkeitstest von @ Aksakal).Ich bin nicht überzeugt von der Demonstration des Genauigkeitsvorteils der SVD mit kleinen Eigenwerten. @ Aksakals Test ist 1-2 Größenordnungen empfindlicher für den Zufallszustand als für den Algorithmus (versuchen Sie, alle Fehler aufzuzeichnen, anstatt sie auf ein absolutes Maximum zu reduzieren). Dies bedeutet, dass kleine Fehler in der Kovarianzmatrix eine größere Auswirkung auf die Genauigkeit haben als die Wahl eines Algorithmus für die Neuzusammenstellung. Dies hat auch nichts mit der Hauptfrage zu tun, bei der es um PCA geht. Die kleinsten Komponenten werden in PCA ignoriert.
Ein ähnliches Argument kann zur numerischen Stabilität angeführt werden. Wenn ich die Kovarianzmatrixmethode für PCA verwenden muss, würde ich sie mit
eigh
anstelle von zerlegensvd
. Wenn dies fehlschlägt (was hier noch nicht demonstriert wurde), lohnt es sich wahrscheinlich, das zu lösende Problem zu überdenken, bevor Sie nach einem besseren Algorithmus suchen.quelle
eigh
vseig
: mail.scipy.org/pipermail/numpy-discussion/2006-March/…Um den letzten Teil Ihrer Frage zu beantworten: "Warum machen sie SVD der Kovarianzmatrix, nicht der Datenmatrix?" Ich glaube, es ist aus Performance- und Speichergründen. Typischerweise ist eine sehr große Zahl, und selbst wenn groß ist, würden wir erwarten .n m ≫ nm n m≫n
Das Berechnen der Kovarianzmatrix und das anschließende Durchführen einer SVD ist unter diesen Bedingungen erheblich schneller als das Berechnen der SVD für die vollständige Datenmatrix, um dasselbe Ergebnis zu erzielen.
Selbst bei relativ kleinen Werten beträgt der Leistungszuwachs mehrere tausend Faktoren (Millisekunden gegenüber Sekunden). Ich habe ein paar Tests auf meinem Computer durchgeführt, um Matlab zu vergleichen:
Das ist nur CPU-Zeit, aber der Speicherbedarf ist genauso wichtig, wenn nicht noch wichtiger. Wenn Sie in Matlab SVD auf einer Million mal Tausend-Matrix versuchen, tritt standardmäßig ein Fehler auf, da eine funktionierende Array-Größe von 7,4 TB erforderlich ist.
quelle