Pertanyaan ini adalah tentang cara yang efisien untuk menghitung komponen utama.
Banyak teks tentang advokasi PCA linier menggunakan dekomposisi nilai singular dari data dengan santai . Yaitu, jika kita memiliki data dan ingin mengganti variabel ( kolomnya ) dengan komponen utama, kita lakukan SVD: , nilai singular (akar kuadrat dari nilai eigen) yang menempati diagonal utama , vektor eigen kanan adalah matriks rotasi ortogonal dari variabel-sumbu ke dalam komponen sumbu, komponen vektor eigen kiri seperti , hanya untuk kasus. Kami kemudian dapat menghitung nilai komponen sebagai .X = U S V ′ S V U V C = X V = U S
Cara lain untuk melakukan PCA variabel adalah melalui dekomposisi matriks kuadrat (yaitu dapat berupa korelasi atau kovarian , dll., variabel). Dekomposisi dapat berupa dekomposisi eigen atau dekomposisi nilai singular: dengan matriks semidefinit positif simetris kuadrat, mereka akan memberikan hasil yang sama dengan nilai eigen seperti diagonal , dan seperti dijelaskan sebelumnya. Nilai komponen akan menjadi .R R = V L V ′ L V
Sekarang, pertanyaan saya: jika data adalah matriks besar, dan jumlah kasus (yang sering merupakan kasus) jauh lebih besar daripada jumlah variabel, maka cara (1) diharapkan akan jauh lebih lambat daripada cara (2) ), karena cara (1) menerapkan algoritma yang cukup mahal (seperti SVD) ke matriks besar; itu menghitung dan menyimpan matriks besar yang kita benar-benar tidak perlu dalam kasus kami (PCA variabel). Jika demikian, lalu mengapa begitu banyak buku teks tampaknya mendukung atau hanya menyebutkan satu-satunya cara (1)? Mungkin itu adalah efisien dan aku kehilangan sesuatu?
sumber
R
svd
Joliffe, Principal component analysis, 2nd ed.
Sebenarnya, Joliffe menjelaskan kedua cara, tetapi dalam bab inti tentang PCA ia mengatakan tentang cara 1, sejauh yang saya ingat.Jawaban:
Berikut adalah 2ct saya tentang topik ini
Kuliah kimia di mana saya pertama kali belajar PCA menggunakan solusi (2), tapi itu tidak berorientasi numerik, dan kuliah numerik saya hanya pengantar dan tidak membahas SVD sejauh yang saya ingat.
Jika saya memahami Holmes: Fast SVD untuk Matriks Skala Besar dengan benar, ide Anda telah digunakan untuk mendapatkan SVD matrik matriks panjang yang cepat secara komputasi.
Itu berarti bahwa implementasi SVD yang baik dapat secara internal mengikuti (2) jika menemui matriks yang sesuai (saya tidak tahu apakah masih ada kemungkinan yang lebih baik). Ini berarti bahwa untuk implementasi tingkat tinggi lebih baik menggunakan SVD (1) dan menyerahkannya pada BLAS untuk menangani algoritma mana yang digunakan secara internal.
Pemeriksaan praktis cepat: OpenBLAS's svd tampaknya tidak membuat perbedaan ini, pada matriks 5e4 x 100,
svd (X, nu = 0)
menggunakan median 3,5 detik, sementarasvd (crossprod (X), nu = 0)
butuh 54 ms (dipanggil dari R withmicrobenchmark
).Kuadrat dari nilai eigen tentu saja cepat, dan hingga itu hasil dari kedua panggilan itu sama.
pembaruan: Lihatlah Wu, W.; Massart, D. & de Jong, S .: Algoritma PCA kernel untuk data luas. Bagian I: Teori dan algoritma, Chemometrics and Intelligent Laboratory Systems, 36, 165 - 172 (1997). DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5
Makalah ini membahas sifat numerik dan komputasi dari 4 algoritma yang berbeda untuk PCA: SVD, eigen decomposition (EVD), NIPALS dan POWER.
Mereka terkait sebagai berikut:
Konteks makalah ini luas , dan mereka bekerja pada (kernel PCA) - ini hanya situasi yang berlawanan dengan yang Anda tanyakan. Jadi untuk menjawab pertanyaan Anda tentang perilaku matriks panjang, Anda perlu bertukar arti "kernel" dan "klasik". X X ′X(30×500) XX′
Tidak mengherankan, EVD dan SVD mengubah tempat tergantung pada apakah algoritma klasik atau kernel digunakan. Dalam konteks pertanyaan ini, ini berarti bahwa satu atau yang lain mungkin lebih baik tergantung pada bentuk matriks.
Tetapi dari diskusi mereka tentang SVD dan EVD "klasik" jelas bahwa dekomposisi adalah cara yang sangat biasa untuk menghitung PCA. Namun, mereka tidak menentukan algoritma SVD mana yang digunakan selain itu mereka menggunakan fungsi Matlab .X′X
svd ()
sumber
svd (X'X)
matriks yang lama.)microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)
bisa menarik juga.SVD lebih lambat tetapi sering dianggap sebagai metode yang disukai karena akurasi numerik yang lebih tinggi.
Seperti yang Anda sebutkan dalam pertanyaan, analisis komponen utama (PCA) dapat dilakukan baik oleh SVD dari matriks data terpusat ( lihat utas T&J ini untuk perincian lebih lanjut ) atau dengan dekomposisi eigen dari matriks kovarians (atau, sebagai alternatif, jika , lihat di sini untuk detail lebih lanjut ).X 1n−1X⊤X XX⊤ n≪p
Inilah yang tertulis dalam bantuan
pca()
fungsi MATLAB :Kalimat terakhir menyoroti pentingnya kecepatan-akurasi trade-off yang berperan di sini.
Anda benar untuk mengamati bahwa komposisi eigend dari matriks kovarians biasanya lebih cepat daripada SVD dari matriks data. Berikut ini adalah patokan pendek di Matlab dengan matriks data acak :1000×100
Cara tercepat dalam hal ini adalah melalui matriks kovarians (baris ketiga). Tentu saja jika (bukan sebaliknya) maka itu akan menjadi cara paling lambat, tetapi dalam kasus itu menggunakan matriks Gram (baris keempat) akan menjadi cara tercepat sebagai gantinya. SVD dari matriks data itu sendiri akan lebih lambat.X X ⊤n≪p XX⊤
Namun, itu akan lebih akurat karena mengalikan dengan dirinya sendiri dapat menyebabkan hilangnya akurasi numerik. Berikut ini adalah contoh, diadaptasi dari jawaban @ JM untuk Mengapa SVD pada lebih disukai daripada eigendekomposisi dalam PCA pada Math.SE.X X X ⊤X X XX⊤
Pertimbangkan matriks data kadang-kadang disebut matriks Läuchli (dan mari kita hilangkan centering untuk contoh ini). Nilai singular kuadratnya adalah , , dan . Mengambil , kita dapat menggunakan SVD dan EIG untuk menghitung nilai-nilai ini:3 + ϵ 2 ϵ 2 ϵ 2 ϵ = 10 - 5
mendapatkan hasil yang identik:
Tetapi dengan mengambil sekarang kita dapat mengamati bagaimana kinerja SVD masih baik tetapi EIG rusak:ϵ=10−10
Apa yang terjadi di sini, adalah bahwa sangat perhitungan kotak kovarians matriks jumlah kondisi dari , sehingga terutama dalam kasus ketika memiliki beberapa kolom hampir collinear (yaitu beberapa nilai singular sangat kecil), pertama komputasi matriks kovariansi dan kemudian komputasi komposisi eigendnya akan menghasilkan kehilangan presisi dibandingkan dengan SVD langsung.XX X
Saya harus menambahkan bahwa orang sering senang mengabaikan potensi kehilangan [kecil] presisi ini dan lebih suka menggunakan metode yang lebih cepat.
sumber
eig()
pendekatan? (Pembaca akan mendapat manfaat: ada titik trade-off antara kecepatan dan stabilitas. Bagaimana seseorang dapat memutuskan dalam situasi praktis yang konkret?)3 0 -3.3307e-16
eigen di spss mengembalikan saya3 0 0
. Sepertinya fungsi tersebut memiliki beberapa nilai toleransi built-in dan tetap di luar yang nol. Dalam contoh ini, fungsi muncul seolah-olah untuk meretas simpul ketidakstabilan numerik dengan memberi nilai nol pada kedua nilai eigen kecil, "0" dan "-16".