Bagaimana cara melakukan PCA untuk data berdimensi sangat tinggi?

12

Untuk melakukan analisis komponen utama (PCA), Anda harus mengurangi rata-rata setiap kolom dari data, menghitung matriks koefisien korelasi dan kemudian menemukan vektor eigen dan nilai eigen. Yah, lebih tepatnya, inilah yang saya lakukan untuk mengimplementasikannya dengan Python, kecuali hanya bekerja dengan matriks kecil karena metode untuk menemukan matriks koefisien korelasi (corrcoef) tidak membiarkan saya menggunakan array dengan dimensi tinggi. Karena saya harus menggunakannya untuk gambar, implementasi saya saat ini tidak benar-benar membantu saya.

Saya telah membaca bahwa sangat mungkin untuk hanya mengambil data matriks dan menghitung bukan , tetapi itu tidak berhasil bagi saya. Yah, saya tidak begitu yakin saya mengerti apa artinya, selain fakta bahwa itu seharusnya menjadi matriks bukannya (dalam kasus saya ). Saya membaca tentang orang-orang di tutorial eigenfaces tetapi tidak satupun dari mereka tampaknya menjelaskannya sedemikian rupa sehingga saya benar-benar bisa mendapatkannya.DDD/nDD/nn×np×ppn

Singkatnya, adakah deskripsi algoritma sederhana dari metode ini sehingga saya dapat mengikutinya?

amuba kata Reinstate Monica
sumber
Apa yang Anda baca benar. Matriks disebut matriks Gram. Vektor eigennya adalah komponen-komponen utama (diskalakan). Nilai eigennya persis sama, hingga faktor , dengan nilai eigen dari matriks kovarian . DD1/nDD/n
Amuba mengatakan Reinstate Monica

Jawaban:

10

Cara termudah untuk melakukan PCA standar adalah dengan memusatkan kolom pada matriks data Anda (dengan asumsi kolom tersebut sesuai dengan variabel yang berbeda) dengan mengurangi rata-rata kolom, dan kemudian melakukan SVD. Vektor singular kiri, dikalikan dengan nilai singular yang sesuai, sesuai dengan komponen utama (diperkirakan). Vektor singular kanan sesuai dengan arah komponen utama (diperkirakan) - ini sama dengan vektor eigen yang diberikan oleh PCA. Nilai singular sesuai dengan standar deviasi komponen utama (dikalikan dengan faktor root n, di mana n adalah jumlah baris dalam matriks data Anda) - sama dengan akar kuadrat dari nilai eigen yang diberikan oleh PCA.

Jika Anda ingin melakukan PCA pada matriks korelasi, Anda harus membakukan kolom-kolom matriks data Anda sebelum menerapkan SVD. Ini sama dengan mengurangi mean (pemusatan) dan kemudian membaginya dengan standar deviasi (penskalaan).

Ini akan menjadi pendekatan yang paling efisien jika Anda menginginkan PCA lengkap. Anda dapat memverifikasi dengan beberapa aljabar bahwa ini memberi Anda jawaban yang sama dengan melakukan dekomposisi spektral dari matriks kovarian sampel.

Ada juga metode yang efisien untuk menghitung SVD parsial, ketika Anda hanya perlu beberapa PC. Beberapa di antaranya adalah varian dari iterasi daya. The Lanczos algoritma adalah salah satu contoh yang juga terkait dengan kuadrat terkecil parsial. Jika matriks Anda besar, Anda mungkin lebih baik dengan metode perkiraan. Ada juga alasan statistik untuk mengatur PCA ketika hal ini terjadi.

vqv
sumber
Perbaiki saya jika saya salah, tetapi saya pikir algoritma Lanczos melakukan eigendecomposition dan bukan SVD.
Amuba kata Reinstate Monica
1
Pembaca yang tertarik dapat melihat di sini untuk rincian lebih lanjut tentang melakukan PCA melalui SVD: Hubungan antara SVD dan PCA. Bagaimana cara menggunakan SVD untuk melakukan PCA?
Amuba mengatakan Reinstate Monica
10

Apa yang Anda lakukan saat ini sudah dekat, tetapi Anda perlu memastikan Anda mengalikan vektor eigen (data . data.T) / linesdi sebelah kiri data.T, untuk mendapatkan vektor eigen dari (data.T . data) / lines. Ini kadang-kadang disebut "trik transpose".

Berikut ini beberapa detail lainnya. Misalkan Anda memiliki matriks mana Anda ingin melakukan PCA; untuk kesederhanaan, anggaplah bahwa kolom telah dinormalisasi menjadi nol rata-rata, sehingga kita hanya perlu menghitung vektor eigen dari matriks kovarians .AAATA

Sekarang jika adalah matriks , dengan , maka adalah matriks sangat besar . Jadi alih-alih menghitung vektor eigen dari , kita mungkin ingin menghitung vektor eigen dari matriks jauh lebih kecil - dengan asumsi kita dapat mencari tahu hubungan antara keduanya. Jadi bagaimana hubungan vektor eigen dengan vektor eigen ?Am×nn>>mATAn×nATAm×mAATATAAAT

Biarkan menjadi vektor eigen dari dengan nilai eigen . KemudianvAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

Dengan kata lain, jika adalah vektor eigen dari , maka adalah vektor eigen dari , dengan nilai eigen yang sama. Jadi saat melakukan PCA pada , bukannya langsung menemukan vektor eigen dari (yang mungkin sangat mahal), lebih mudah untuk menemukan vektor eigen dari dan kemudian kalikan ini pada ditinggalkan oleh untuk mendapatkan vektor eigen dari .vAATATvATAAATAvAATATATvATA

raegtin
sumber
1
Ini terdengar seperti "trik kernel" yang diterapkan pada PCA. en.wikipedia.org/wiki/Kernel_PCA Ini adalah cara yang sangat baik untuk menangani matriks besar tertentu.
Gilead
+1. Mungkin orang harus menambahkan bahwa disebut matriks Gram. AA
Amuba kata Reinstate Monica
8

Kedengarannya seperti yang Anda inginkan adalah algoritma NIPALS untuk melakukan PCA. Ini adalah algoritma yang sangat populer di kalangan ahli statistik. Ini memiliki banyak keunggulan:

  • Secara komputasi lebih murah daripada SVD atau metode dekomposisi nilai eigen jika hanya beberapa komponen pertama yang diperlukan.
  • Memiliki persyaratan penyimpanan yang lebih sederhana secara umum karena matriks kovarians tidak pernah terbentuk. Ini adalah properti yang sangat penting untuk dataset yang sangat besar.
  • Dapat menangani data yang hilang dalam dataset (meskipun itu bukan masalah dalam masalah Anda, karena Anda berurusan dengan gambar).

Deskripsi
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Algoritma
Berikut adalah deskripsi sederhana dan luar biasa dari algoritma (di bagian 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Ingat untuk mengartikan skala pusat sebelum melakukan PCA karena skala-sensitif.

Gilead
sumber
4

Untuk menambahkan jawaban Gilead, mereka secara algoritma lebih murah untuk PCA terpotong. NIPALS memang sangat populer, tetapi saya telah memiliki banyak kesuksesan dengan metode perkiraan yang melakukan suksesi kecocokan pada data parsial (apa yang sering disebut PCA dengan proyeksi acak). Ini dibahas dalam utas metaoptimize .

Seperti yang Anda sebutkan Python, izinkan saya menunjukkan bahwa algoritma diimplementasikan dalam scikit-learning : kelas PCA . Secara khusus, ini digunakan dalam contoh yang menunjukkan eigenfaces .

Gael Varoquaux
sumber