Saya ingin menggunakan analisis komponen utama (PCA) untuk reduksi dimensi. Apakah numpy atau scipy sudah memilikinya, atau apakah saya harus menggulung sendiri menggunakan numpy.linalg.eigh
?
Saya tidak hanya ingin menggunakan dekomposisi nilai tunggal (SVD) karena data masukan saya cukup berdimensi tinggi (~ 460 dimensi), jadi menurut saya SVD akan lebih lambat daripada menghitung vektor eigen dari matriks kovarian.
Saya berharap untuk menemukan implementasi yang sudah dibuat sebelumnya dan di-debug yang sudah membuat keputusan yang tepat tentang kapan harus menggunakan metode mana, dan yang mungkin melakukan pengoptimalan lain yang tidak saya ketahui.
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.
Beberapa bulan kemudian, inilah PCA kelas kecil, dan gambarnya:
sumber
Penggunaan PCA
numpy.linalg.svd
sangat mudah. Berikut demo sederhana:sumber
svd
sudah kembalis
seperti yang diurutkan dalam urutan menurun, sejauh dokumentasi berjalan. (Mungkin ini tidak terjadi pada tahun 2012, tetapi hari ini adalah)Anda dapat menggunakan sklearn:
sumber
matplotlib.mlab memiliki implementasi PCA .
sumber
SVD harus bekerja dengan baik dengan 460 dimensi. Dibutuhkan sekitar 7 detik pada netbook Atom saya. Metode eig () membutuhkan lebih banyak waktu (sebagaimana mestinya, menggunakan lebih banyak operasi floating point) dan hampir selalu kurang akurat.
Jika Anda memiliki kurang dari 460 contoh maka yang ingin Anda lakukan adalah mendiagonalisasi matriks pencar (x - datamean) ^ T (x - mean), dengan asumsi titik data Anda adalah kolom, lalu mengalikan kiri dengan (x - datamean). Itu mungkin lebih cepat jika Anda memiliki lebih banyak dimensi daripada data.
sumber
Anda dapat dengan mudah "menggulung" sendiri menggunakan
scipy.linalg
(dengan asumsi kumpulan data yang dipusatkan sebelumnyadata
):Kemudian
evs
adalah nilai eigen Anda, danevmat
matriks proyeksi Anda.Jika Anda ingin mempertahankan
d
dimensi, gunakan nilaid
eigen pertama dand
vektor eigen pertama .Mengingat
scipy.linalg
perkalian matriks yang memiliki dekomposisi dan numpy, apa lagi yang Anda butuhkan?sumber
eig()
matriks kovarian.Saya baru saja selesai membaca buku Machine Learning: An Algorithmic Perspective . Semua contoh kode di buku itu ditulis oleh Python (dan hampir dengan Numpy). Potongan kode chatper10.2 Analisis Komponen Utama mungkin layak dibaca. Ini menggunakan numpy.linalg.eig.
Omong-omong, saya rasa SVD dapat menangani dimensi 460 * 460 dengan sangat baik. Saya telah menghitung 6500 * 6500 SVD dengan numpy / scipy.linalg.svd pada PC yang sangat tua: Pentium III 733mHz. Sejujurnya, skrip membutuhkan banyak memori (sekitar 1.xG) dan banyak waktu (sekitar 30 menit) untuk mendapatkan hasil SVD. Tapi saya pikir 460 * 460 pada PC modern tidak akan menjadi masalah besar kecuali jika Anda perlu melakukan SVD berkali-kali.
sumber
Anda tidak perlu Dekomposisi Nilai Singular (SVD) penuh karena ia menghitung semua nilai eigen dan vektor eigen dan dapat menjadi penghalang untuk matriks besar. scipy dan modul renggangnya menyediakan fungsi algrebra linier generik yang bekerja pada matriks renggang dan padat, di antaranya terdapat keluarga fungsi eig *:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations
Scikit-learn menyediakan implementasi Python PCA yang hanya mendukung matriks padat untuk saat ini.
Waktu:
sumber
eigsh
sebenarnya ~ 4x lebih lambat daripadaeigh
matriks nonsparse. Hal yang sama berlaku untukscipy.sparse.linalg.svds
versusnumpy.linalg.svd
. Saya akan selalu menggunakan SVD daripada dekomposisi eigenvalue karena alasan yang disebutkan @dwf, dan mungkin menggunakan versi SVD yang jarang jika matriks menjadi sangat besar.eigsh
dansvds
lebih cepat daripadaeigh
dansvd
dengan faktor ~ 3, tetapi jika A lebih kecil, katakan 100 * 100, makaeigh
dansvd
lebih cepat dengan faktor ~ 4 dan ~ 1,5 masing-masing . T masih akan menggunakan SVD jarang pada dekomposisi nilai eigen yang jarang.Berikut adalah implementasi lain dari modul PCA untuk python menggunakan numpy, scipy dan C-extension. Modul ini menjalankan PCA menggunakan algoritma SVD atau NIPALS (Nonlinear Iterative Partial Least Squares) yang diimplementasikan di C.
sumber
Jika Anda bekerja dengan vektor 3D, Anda dapat menerapkan SVD secara ringkas menggunakan toolbelt vg . Ini adalah lapisan tipis di atas numpy.
Ada juga alias yang nyaman jika Anda hanya menginginkan komponen utama pertama:
Saya membuat perpustakaan ini pada startup terakhir saya, yang dimotivasi oleh penggunaan seperti ini: ide sederhana yang bertele-tele atau tidak jelas di NumPy.
sumber