Algoritma PCA tercepat untuk data dimensi tinggi

11

Saya ingin melakukan PCA pada dataset yang terdiri dari sekitar 40.000 sampel, masing-masing sampel menampilkan sekitar 10.000 fitur.

Menggunakan fungsi princomp Matlab secara konsisten membutuhkan waktu lebih dari setengah jam di mana saya mematikan proses. Saya ingin mencari implementasi / algoritma yang berjalan dalam waktu kurang dari 10 menit. Apa yang akan menjadi algoritma tercepat? Berapa lama waktu yang dibutuhkan untuk i7 dual core / 4GB Ram?

lembut
sumber
Ya, Anda benar, saya harus lebih tepat. Butuh lebih dari setengah jam, lalu saya memutuskan untuk menghentikan prosesnya. Saya harus melakukan ini setidaknya sepuluh kali, akan menyenangkan untuk memiliki sesuatu yang bekerja dalam waktu kurang dari 10 menit
mellow
Seberapa jarang matriks Anda?
Arnold Neumaier
Persentase nol dalam matriks adalah di atas 80%
mellow
Lihat juga kernal-PCA.
meawoppl

Jawaban:

11

Pertama-tama, Anda harus menentukan apakah Anda ingin semua komponen atau yang paling signifikan?

Nyatakan matriks Anda dengan menjadi jumlah sampel dan dimensi N MARN×MNM

Jika Anda ingin semua komponen cara klasik untuk pergi adalah menghitung matriks kovarians (yang memiliki kompleksitas waktu ) dan kemudian menerapkan SVD untuk itu (tambahan ). Dalam hal memori, ini akan membutuhkan (matriks kovarian + vektor tunggal dan nilai-nilai yang membentuk basis ortogonal) atau GB dalam presisi ganda untuk . O ( N M 2 ) O ( M 3 ) O ( 2 M 2 ) 1.5 ACRM×MO(NM2)O(M3)O(2M2)1.5A

Anda bisa menerapkan SVD langsung ke matriks jika Anda menormalkan setiap dimensi sebelum itu dan mengambil vektor singular kiri. Namun, praktis saya akan mengharapkan SVD dari matriks lebih lama.AAA

Jika Anda hanya membutuhkan sebagian kecil komponen (mungkin paling signifikan), Anda mungkin ingin menerapkan PCA iteratif . Sejauh yang saya tahu semua algoritma ini terkait erat dengan proses Lanczos sehingga Anda bergantung pada spektrum dan secara praktis akan sulit untuk mencapai akurasi SVD untuk vektor yang diperoleh dan akan menurun dengan jumlah vektor tunggal.C

Alexander
sumber
2

Saya kira Anda hanya perlu beberapa (atau beberapa ratus) pasangan nilai / vektor singular dominan. Maka yang terbaik adalah menggunakan metode berulang, yang akan jauh lebih cepat dan mengkonsumsi memori jauh lebih sedikit.

Di Matlab, lihat

bantuan svds

Arnold Neumaier
sumber
Ya sepertinya metode berulang jauh lebih cepat jika saya hanya perlu seratus komponen pertama.
mellow
Sejauh menyangkut svds, saya mencoba untuk menempatkan matriks saya ke dalam format yang jarang dan memodifikasi fungsi princomp untuk menempatkan svds alih-alih svd, dan yang mengejutkan saya butuh waktu lebih lama pada matriks 2000 * 4000 (180 s bukannya 15s ). Aneh ...
mellow
1
Tidak perlu beralih ke format jarang. Juga, Anda perlu mengurangi jumlah vektor tunggal yang ingin Anda hitung. Untuk menghitung fiull svd, svds tidak cocok.
Arnold Neumaier
2
Yang juga perlu diperhatikan untuk mode dominan adalah metode svd acak yang lebih baru, seperti di stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger
2

Anda dapat memeriksa jawaban saya di Cross Validated . Saya tidak ingin menyalinnya di sini. Pada dasarnya, Anda dapat menggunakan SVD acak yang cepat untuk menghitung basis dan koefisien PCA.

petrichor
sumber