Ich verstehe die Beziehung zwischen Hauptkomponentenanalyse und Singularwertzerlegung auf algebraischer / exakter Ebene. Meine Frage bezieht sich auf die Implementierung von Scikit-Learn .
In der Dokumentation heißt es: " [TruncatedSVD] ist PCA sehr ähnlich, arbeitet jedoch direkt mit Stichprobenvektoren anstatt mit einer Kovarianzmatrix. " Dies würde den algebraischen Unterschied zwischen beiden Ansätzen widerspiegeln. Später heißt es jedoch: " Dieser Schätzer [TruncatedSVD] unterstützt zwei Algorithmen: einen schnell randomisierten SVD-Löser und einen" naiven "Algorithmus, der ARPACK als Eigensolver für (X * XT) oder (XT * X) verwendet, je nachdem, welcher Wert höher ist effizient. ". In Bezug auf PCAheißt es: "Lineare Dimensionsreduktion unter Verwendung der Singularwertzerlegung der Daten, um sie zu projizieren ...". Die PCA-Implementierung unterstützt dieselben zwei Algorithmen (randomisiert und ARPACK) sowie einen weiteren, LAPACK. Wenn ich mir den Code anschaue, kann ich sehen, dass sowohl ARPACK als auch LAPACK in PCA und TruncatedSVD auf Beispieldaten X svd ausführen, wobei ARPACK in der Lage ist, mit spärlichen Matrizen umzugehen (unter Verwendung von svds).
Abgesehen von verschiedenen Attributen und Methoden und der Tatsache, dass PCA zusätzlich eine exakte vollständige Singularwertzerlegung mit LAPACK durchführen kann, scheinen PCA- und TruncatedSVD-Scikit-Learn-Implementierungen genau der gleiche Algorithmus zu sein. Erste Frage: Ist das richtig?
Zweite Frage: Obwohl LAPACK und ARPACK scipy.linalg.svd (X) und scipy.linalg.svds (X) verwenden und X die Stichprobenmatrix sind, berechnen sie die Singularwertzerlegung oder Eigenzerlegung von oder X. ∗ X T intern. Während der "zufällige" Löser das Produkt nicht berechnen muss. (Dies ist im Zusammenhang mit der numerischen Stabilität relevant, siehe Warum PCA von Daten mittels SVD der Daten? ). Ist das richtig?
Relevanter Code: PCA- Zeile 415. TruncatedSVD- Zeile 137.
quelle
Xtimes()
Xt_times()
Antworten:
Nein: PCA ist (abgeschnitten) SVD für zentrierte Daten (durch mittlere Subtraktion pro Merkmal). Wenn die Daten bereits zentriert sind, machen diese beiden Klassen dasselbe.
In der Praxis
TruncatedSVD
ist dies bei großen, spärlichen Datensätzen hilfreich, die nicht zentriert werden können, ohne dass die Speichernutzung explodiert.numpy.linalg.svd
undscipy.linalg.svd
beide verlassen sich auf LAPACK _GESDD, das hier beschrieben wird: http://www.netlib.org/lapack/lug/node32.html (Treiber teilen und erobern)scipy.sparse.linalg.svds
stützt sich auf ARPACK, um eine Eigenwertzerlegung von XT durchzuführen. X oder X. XT (abhängig von der Form der Daten) über die Arnoldi-Iterationsmethode. Das HTML-Benutzerhandbuch von ARPACK weist eine fehlerhafte Formatierung auf, die die Berechnungsdetails verbirgt. Die Arnoldi-Iteration ist jedoch auf Wikipedia gut beschrieben: https://en.wikipedia.org/wiki/Arnoldi_iterationHier ist der Code für die ARPACK-basierte SVD in scipy:
https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (Suche nach der Zeichenfolge für "def svds" im Falle einer Zeilenänderung im Quellcode ).
quelle