Ich möchte die Hauptkomponentenanalyse (PCA) zur Reduzierung der Dimensionalität verwenden. Hat numpy oder scipy es schon oder muss ich mein eigenes mit rollennumpy.linalg.eigh
?
Ich möchte nicht nur die Singular Value Decomposition (SVD) verwenden, da meine Eingabedaten ziemlich hochdimensional sind (~ 460 Dimensionen), daher denke ich, dass SVD langsamer ist als die Berechnung der Eigenvektoren der Kovarianzmatrix.
Ich hatte gehofft, eine vorgefertigte, debuggte Implementierung zu finden, die bereits die richtigen Entscheidungen trifft, wann welche Methode verwendet werden soll und welche möglicherweise andere Optimierungen vornimmt, von denen ich nichts weiß.
Note that from this release MDP is in maintenance mode. 13 years after its first public release, MDP has reached full maturity and no new features are planned in the future.
Monate später hier eine kleine Klasse PCA und ein Bild:
quelle
Die Verwendung von PCA
numpy.linalg.svd
ist super einfach. Hier ist eine einfache Demo:quelle
svd
kehrt bereitss
in absteigender Reihenfolge sortiert zurück, soweit die Dokumentation reicht. (Vielleicht war dies 2012 nicht der Fall, aber heute ist es so)Sie können sklearn verwenden:
quelle
matplotlib.mlab hat eine PCA-Implementierung .
quelle
SVD sollte mit 460 Dimensionen gut funktionieren. Auf meinem Atom-Netbook dauert es ungefähr 7 Sekunden. Die eig () -Methode benötigt mehr Zeit (wie es sollte, verwendet sie mehr Gleitkommaoperationen) und ist fast immer weniger genau.
Wenn Sie weniger als 460 Beispiele haben, möchten Sie die Streumatrix (x - Datamean) ^ T (x - Mittelwert) diagonalisieren, vorausgesetzt, Ihre Datenpunkte sind Spalten, und dann mit (x - Datamean) links multiplizieren. Dies ist möglicherweise schneller, wenn Sie mehr Dimensionen als Daten haben.
quelle
Sie können ganz einfach Ihre eigenen "rollen"
scipy.linalg
(unter der Annahme eines vorzentrierten Datensatzesdata
):Dann
evs
sind Ihre Eigenwerte undevmat
Ihre Projektionsmatrix.Wenn Sie
d
Dimensionen beibehalten möchten , verwenden Sie die erstend
Eigenwerte und erstend
Eigenvektoren.scipy.linalg
Was brauchen Sie angesichts der Zerlegung und der Anzahl der Matrixmultiplikationen noch?quelle
eig()
in einer Kovarianzmatrix zu ermitteln.Ich lese gerade das Buch Maschinelles Lernen: Eine algorithmische Perspektive . Alle Codebeispiele im Buch wurden von Python (und fast mit Numpy) geschrieben. Das Code-Snippet von chatper10.2 Principal Components Analysis ist möglicherweise eine Lektüre wert. Es wird numpy.linalg.eig verwendet.
Ich denke übrigens, SVD kann 460 * 460 Dimensionen sehr gut verarbeiten. Ich habe eine 6500 * 6500 SVD mit numpy / scipy.linalg.svd auf einem sehr alten PC berechnet: Pentium III 733mHz. Um ehrlich zu sein, benötigt das Skript viel Speicher (ca. 1.xG) und viel Zeit (ca. 30 Minuten), um das SVD-Ergebnis zu erhalten. Aber ich denke, 460 * 460 auf einem modernen PC wird kein großes Problem sein, es sei denn, Sie müssen SVD sehr oft ausführen.
quelle
Sie benötigen keine vollständige Singular Value Decomposition (SVD), da sie alle Eigenwerte und Eigenvektoren berechnet und für große Matrizen unzulässig sein kann. scipy und sein Sparse-Modul bieten generische lineare Algrebra-Funktionen, die sowohl für Sparse- als auch für dichte Matrizen arbeiten. Darunter befindet sich die eig * -Funktionsfamilie:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations
Scikit-learn bietet eine Python-PCA-Implementierung, die derzeit nur dichte Matrizen unterstützt.
Timings:
quelle
eigsh
ist es tatsächlich ~ 4x langsamer alseigh
bei nicht sparsamen Matrizen. Gleiches gilt fürscipy.sparse.linalg.svds
versusnumpy.linalg.svd
. Ich würde aus den von @dwf genannten Gründen immer mit SVD über die Eigenwertzerlegung gehen und vielleicht eine spärliche Version von SVD verwenden, wenn die Matrizen wirklich riesig werden.eigsh
undsvds
dann schneller alseigh
undsvd
um einen Faktor von ~ 3 ist, aber wenn A kleiner ist, sagen wir 100 * 100, danneigh
undsvd
um Faktoren von ~ 4 bzw. ~ 1,5 schneller sind . T würde jedoch immer noch eine spärliche SVD über eine spärliche Eigenwertzerlegung verwenden.Hier ist eine weitere Implementierung eines PCA-Moduls für Python mit Numpy-, Scipy- und C-Erweiterungen. Das Modul führt die PCA entweder mit einem SVD- oder dem in C implementierten NIPALS-Algorithmus (Nonlinear Iterative Partial Least Squares) durch.
quelle
Wenn Sie mit 3D-Vektoren arbeiten, können Sie SVD mit dem Toolbelt vg präzise anwenden . Es ist eine leichte Schicht auf Numpy.
Es gibt auch einen praktischen Alias, wenn Sie nur die erste Hauptkomponente möchten:
Ich habe die Bibliothek bei meinem letzten Start erstellt, wo sie durch Verwendungen wie diese motiviert war: einfache Ideen, die in NumPy ausführlich oder undurchsichtig sind.
quelle