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.
Singkatnya, adakah deskripsi algoritma sederhana dari metode ini sehingga saya dapat mengikutinya?
Jawaban:
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.
sumber
Apa yang Anda lakukan saat ini sudah dekat, tetapi Anda perlu memastikan Anda mengalikan vektor eigen
(data . data.T) / lines
di sebelah kiridata.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 .A A ATA
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 ?A m×n n>>m ATA n×n ATA m×m AAT ATA AAT
Biarkan menjadi vektor eigen dari dengan nilai eigen . Kemudianv AAT λ
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 .v AAT ATv ATA A ATA v AAT AT ATv ATA
sumber
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:
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.
sumber
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 .
sumber