Terapkan PCA pada matriks jarang yang sangat besar

16

Saya melakukan tugas klasifikasi teks dengan R, dan saya mendapatkan matriks istilah dokumen dengan ukuran 22490 sebanyak 120.000 (hanya 4 juta entri bukan nol, entri kurang dari 1%). Sekarang saya ingin mengurangi dimensionalitas dengan memanfaatkan PCA (Principal Component Analysis). Sayangnya, R tidak dapat menangani matriks besar ini, jadi saya menyimpan matriks jarang ini dalam file di "Format Pasar Matriks", berharap untuk menggunakan beberapa teknik lain untuk melakukan PCA.

Jadi siapa pun dapat memberi saya beberapa petunjuk untuk perpustakaan yang bermanfaat (apa pun bahasa pemrogramannya), yang dapat melakukan PCA dengan matriks skala besar ini dengan mudah, atau melakukan PCA sendiri, dengan kata lain, menghitung matriks kovarians pada awalnya, dan lalu hitung nilai eigen dan vektor eigen untuk matriks kovarians .

Yang saya inginkan adalah menghitung semua PC (120.000), dan hanya memilih PC N teratas, yang menyumbang varian 90% . Jelas, dalam hal ini, saya harus memberikan ambang apriori untuk menetapkan beberapa nilai varians yang sangat kecil ke 0 (dalam matriks kovarians), jika tidak, matriks kovarians tidak akan jarang dan ukurannya akan menjadi 120.000 kali 120.000, yang merupakan mustahil untuk ditangani dengan satu mesin tunggal. Juga, pemuatan (vektor eigen) akan sangat besar, dan harus disimpan dalam format yang jarang.

Terima kasih banyak atas bantuannya!

Catatan: Saya menggunakan mesin dengan RAM 24GB dan 8 core cpu.

Ensom Hodder
sumber
Seberapa jarang matriksnya? Bagaimana Anda menggunakan SVD yang dihasilkan? Jika Anda hanya membutuhkan sebagian saja, Anda mungkin bisa memperkirakannya jauh lebih murah.
Arnold Neumaier
@ArnoldNeumaier Maaf, saya lupa menambahkan info yang jarang. Saya telah memperbarui posting, bersama dengan ide lengkap saya.
Ensom Hodder
masing-masing SLEPc, mahout dan irlba yang disarankan dalam jawaban sejauh ini tampaknya cocok untuk masalah Anda.
Arnold Neumaier
1
Mengapa Anda ingin menghitung semua 120k? Sepertinya Anda hanya menginginkan 90% dari varian, yang seharusnya jauh lebih murah untuk dihitung.
Jed Brown
@JedBrown Hei Jed, Anda benar sekali! Saya hanya tertarik pada mereka yang menyumbang varian 90%, dan juga vektor eigen yang sesuai (untuk mengubah dataset uji setelah itu). Bisakah Anda memberi tahu saya metode yang lebih murah ?
Ensom Hodder

Jawaban:

4

Saya menyarankan paket irlba - ia menghasilkan hasil yang hampir sama dengan svd, namun Anda dapat menentukan sejumlah kecil nilai tunggal untuk dipecahkan. Contoh, menggunakan matriks jarang untuk menyelesaikan hadiah Netflix, dapat ditemukan di sini: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html

Marc di dalam kotak
sumber
Terima kasih atas komentar anda Sebenarnya, saya sudah menonton video itu dan juga mencoba paket irlba kemarin, tetapi sepertinya itu bisa digunakan hanya untuk menghitung beberapa nilai tunggal. Namun, seperti yang dinyatakan dalam posting, saya ingin menghitung SEMUA nilai singular (120.000), sehingga dapat memilih jumlah PC yang sesuai sesuai dengan varians yang diperhitungkan. Dalam hal ini, saya kira irlba tidak lagi cocok.
Ensom Hodder
Bisakah Anda menggunakan hasil SVD dengan cara yang mirip dengan PCA? Apakah Anda tidak perlu memusatkan data SEBELUM melakukan SVD, untuk melakukan PCA?
Zach
@Zach - SVD adalah algoritma utama di belakang PCA (lihat prcomp - stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ). Pemusatan data juga merupakan prosedur standar sebelum dikenakan PCA, meskipun ada beragam pilihan tergantung pada pertanyaan Anda (mis. Berbagai jenis penskalaan juga dapat diterapkan).
Marc di dalam kotak
Seberapa besar kesepakatannya jika saya tidak memusatkan data sebelum SVD? Saya memiliki matriks jarang yang cocok dengan memori, tetapi pemusatan akan membuatnya padat dan terlalu besar untuk masuk ke dalam memori.
Zach
@ Zach - Ini benar-benar tergantung pada bagaimana Anda ingin menghubungkan sampel Anda satu sama lain. Jika Anda tidak dapat bekerja dengan data terpusat karena batas memori, maka saya kira keputusan telah dibuat untuk Anda. Secara umum, pemusatan data membuat PCA beroperasi pada matriks kovarian sampel, sementara pemusatan dan penskalaan data membuat PCA beroperasi pada matriks korelasi. Untuk informasi lebih lanjut tentang keputusan ini, Anda dapat mempertimbangkan mengajukan pertanyaan di stats.stackexchange.com atau mencari jawaban yang ada tentang PCA.
Marc di dalam kotak
8

Saya sarankan menggunakan SLEPc untuk menghitung sebagian SVD. Lihat Bab 4 dari Manual Pengguna dan halaman manual SVD untuk detailnya.

Jed Brown
sumber
1
Karena dia menginginkan PCA, dia harus memusatkan data sebelum menghitung SVD. Ini akan merusak sparsity. Apakah ada cara SLEPc mengakomodasi hal ini?
dranxo
3
Itu hanya peringkat rendah + jarang. SLEPc tidak perlu entri matriks, hanya operator linier, yang dapat diterapkan sebagai matriks jarang plus koreksi.
Jed Brown
2

Saya memilih mahout yang juga bagus untuk tugas NLP / TA lainnya dan mengimplementasikan peta / perkecil.

danas.zuokas
sumber
Ya, Anda benar, Mahout persis di peta jalan saya. Tapi saya lebih suka membuat prototipe dengan beberapa teknik "sederhana" (saya kira) sebelumnya.
Ensom Hodder
1

Saya sarankan menggunakan dekomposisi nilai singular tambahan, yang ada banyak dalam literatur. Contohnya:

Semua pendekatan ini direduksi menjadi sebagai berikut:

  • mulai dengan kumpulan data kecil
  • menghitung SVD entah bagaimana (langkah ini sepele untuk matriks kolom tunggal)
  • ulangi sampai selesai:
    • tambahkan kumpulan data baru
    • gunakan aturan SVD & perbarui yang ada untuk menghitung SVD kumpulan data baru

N

Geoff Oxberry
sumber
0

Anda masih bisa menggunakan R.

Revolution Radalah build R yang menangani kumpulan data yang lebih besar dari RAM. Gunakan fungsinya princomp.

Ini juga memiliki berbagai fungsi statistik yang dirancang khusus untuk masalah gaya data besar yang tidak sesuai dengan RAM, misalnya regresi linier, regresi logistik, kuantil, dll.

Anda dapat mengunduh versi Akademik berfitur lengkap tanpa biaya, dengan mencentang kotak "Saya seorang akademisi".

Contango
sumber