Ich versuche, mit Abdi & amp; Williams - Hauptkomponentenanalyse (2010) und Hauptkomponenten über SVD mit numpy.linalg.svd
.
Wenn ich das Attribut components_
von einer angepassten PCA mit anzeigt sklearn, sie haben genau die gleiche Größe wie die, die ich manuell berechnet habe, aber einige (nicht alle) haben ein entgegengesetztes Vorzeichen. Was verursacht das?
Aktualisieren : Meine (Teil-) Antwort enthält einige zusätzliche Informationen.
Nehmen Sie die folgenden Beispieldaten:
%Vor%Wie Sie in Ihrer Antwort herausgefunden haben, sind die Ergebnisse einer Singular Value Decomposition (SVD) in Bezug auf singuläre Vektoren nicht eindeutig. In der Tat, wenn die SVD von X \ sum_1 ^ r \ s_i u_i v_i ^ \ top ist:
mit dem s_i in absteigender Reihenfolge sortiert, dann können Sie sehen, dass Sie das Vorzeichen (d. h. "flip") von sagen u_1 und v_1 ändern können, die Minuszeichen werden abbrechen, so dass die Formel immer noch halten.
Dies zeigt, dass die SVD einzigartig ist bis zu einer Änderung des Vorzeichens in Paaren von linken und rechten singulären Vektoren .
Da die PCA nur eine SVD von X (oder eine Eigenwertzerlegung von X ^ \ top X) ist, gibt es keine Garantie, dass sie nicht jedes Mal, wenn sie ausgeführt wird, unterschiedliche Ergebnisse auf demselben X zurückgibt. Verständlicherweise möchte scikit lerne implementation dies vermeiden: Sie garantieren, dass die zurückgegebenen linken und rechten singulären Vektoren (gespeichert in U und V) immer gleich sind, indem sie (was willkürlich ist) den größten Koeffizienten von u_i im absoluten Wert positiv darstellt .
Wie Sie sehen können die Quelle : Zuerst berechnen sie U und V mit linalg.svd()
. Wenn dann für jeden Vektor u_i (d. H. Zeile von U) sein größtes Element im Absolutwert positiv ist, tun sie nichts. Andernfalls ändern sie u_i zu - u_i und den entsprechenden linken singulären Vektor v_i zu - v_i. Wie bereits erwähnt, ändert dies nicht die SVD-Formel, da das Minuszeichen aufgehoben wird. Nun ist jedoch sichergestellt, dass die nach dieser Verarbeitung zurückgegebenen U und V immer gleich sind, da die Unbestimmtheit auf dem Zeichen entfernt wurde.
Mit der PCA hier in 3 Dimensionen, finden Sie im Wesentlichen iterativ: 1) Die 1D-Projektionsachse mit der maximalen Varianz erhalten 2) Die maximale Varianz Erhaltung Achse senkrecht zu der in 1). Die dritte Achse ist automatisch diejenige, die senkrecht zu den ersten beiden steht.
Die Komponenten_ sind gemäß der erklärten Varianz aufgelistet. Also erklärt der erste die größte Varianz und so weiter. Beachten Sie, dass bei der Definition der PCA-Operation das Vorzeichen des Vektors keine Rolle spielt, während Sie versuchen, den Vektor für die Projektion im ersten Schritt zu finden, der die beibehaltene Varianz maximiert. Sei M Ihre Datenmatrix (in Ihrem Fall) mit der Form von (20,3)). Sei v1 der Vektor zum Erhalten der maximalen Varianz, wenn die Daten projiziert werden. Wenn Sie -v1 statt v1 auswählen, erhalten Sie dieselbe Varianz. (Sie können das überprüfen). Wenn Sie dann den zweiten Vektor wählen, sei v2 derjenige, der senkrecht auf v1 steht und die maximale Varianz beibehält. Durch die Auswahl von -v2 anstelle von v2 wird dieselbe Varianz beibehalten. v3 kann dann entweder als -v3 oder v3 ausgewählt werden. Hier kommt es nur darauf an, dass v1, v2, v3 eine orthonormale Basis für die Daten M bilden. Die Zeichen hängen hauptsächlich davon ab, wie der Algorithmus das Eigenvektorenproblem löst, das der PCA-Operation zugrunde liegt. Eigenwertzerlegung oder SVD-Lösungen können sich in Vorzeichen unterscheiden.
Nachdem ich etwas gegraben habe, habe ich einige, aber nicht alle meiner Verwirrung darüber aufgeklärt. Dieses Problem wurde in stats.stackexchange behandelt. hier . Die mathematische Antwort lautet: "PCA ist eine einfache mathematische Transformation. Wenn Sie die Vorzeichen der Komponente (n) ändern, ändern Sie nicht die Varianz, die in der ersten Komponente enthalten ist." Allerdings , in diesem Fall (mit sklearn.PCA
), ist die Quelle der Mehrdeutigkeit viel spezifischer: in der Quelle ( Zeile 391 ) für PCA
, die Sie haben:
svd_flip
wird wiederum hier sklearn
nicht inkorrekt ist, glaube ich nicht, dass es so intuitiv ist. Jeder im Finanzbereich, der mit dem Konzept eines Beta (Koeffizienten) vertraut ist, wird wissen, dass die erste Hauptkomponente höchstwahrscheinlich einem breiten Marktindex ähnelt. Problem ist, dass die sklearn
-Implementierung Ihnen starke negative Belastungen für diese erste Hauptkomponente bringt.
Meine Lösung ist eine heruntergekommene Version , die svd_flip
nicht implementiert. Es ist ziemlich barebones in dem es nicht sklearn
Parameter wie svd_solver
hat, aber hat eine Reihe von Methoden speziell auf diesen Zweck ausgerichtet.
Dies ist eine kurze Notiz für diejenigen, die sich für den Zweck und nicht für den Mathe-Teil interessieren.
Obwohl das Vorzeichen für einige der Komponenten entgegengesetzt ist, sollte dies nicht als Problem betrachtet werden. In der Tat interessiert uns (zumindest nach meinem Verständnis) die Richtung der Achsen. Die Komponenten sind schließlich Vektoren, die diese Achsen identifizieren, nachdem die Eingabedaten mit Hilfe von pca transformiert wurden. Unabhängig davon, in welche Richtung jede Komponente zeigt, sind die neuen Achsen, auf denen unsere Daten liegen, dieselben.
Tags und Links python python-3.x numpy scikit-learn pca