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.