Apakah komponen PCA benar-benar mewakili persentase varian? Bisakah mereka berjumlah lebih dari 100%?


13

"Machine Learning For Hackers" O'Reilly mengatakan bahwa setiap komponen utama mewakili persentase perbedaan. Saya mengutip bagian yang relevan dari halaman di bawah ini (bab 8, hal.207). Berbicara dengan ahli lain, mereka sepakat itu persentase.

Namun 24 komponen berjumlah 133,2095%. Bagaimana itu bisa terjadi?

Setelah meyakinkan diri sendiri bahwa kita dapat menggunakan PCA, bagaimana kita melakukannya dalam R? Sekali lagi, ini adalah tempat di mana R bersinar: keseluruhan PCA dapat dilakukan dalam satu baris kode. Kami menggunakan fungsi princomp untuk menjalankan PCA:

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

Jika kita cukup mengetik pca ke R, kita akan melihat ringkasan cepat dari komponen utama:

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

Dalam ringkasan ini, standar deviasi memberi tahu kami berapa banyak varian dalam set data yang diperhitungkan oleh komponen utama yang berbeda. Komponen pertama, disebut Comp.1, menyumbang 29% dari varians, sedangkan komponen berikutnya menyumbang 20%. Pada akhirnya, komponen terakhir, Comp.24, menyumbang kurang dari 1% dari varians. Ini menunjukkan bahwa kita dapat belajar banyak tentang data kita hanya dengan melihat komponen utama pertama.

[Kode dan data dapat ditemukan di github .]


6
Saya pikir interpretasi penulis tentang Standard deviationsini sedikit salah. Karena standar deviasi sebenarnya adalah standar deviasi, kita harus mengaturnya untuk melihat berapa banyak varian yang diwakili oleh masing-masing komponen. Komponen pertama akan mewakili persen dari total varians. 100×29.1001249229.10012492++0.43479832
Diasumsikan normal

4
Pertanyaan ini muncul dari dua kesalahan mendasar, saya khawatir: (1) ia melewatkan judul yang mengumumkan bahwa angka-angka itu adalah "standar deviasi" dan kesalahan untuk varians dan (2) ia menganggap angka-angka itu persen, tetapi tidak. (Unit mereka adalah apa pun yang diukur dalam stok: dolar atau perubahan persen per tahun atau apa pun.) Tidak ada bug sama sekali di sini: komentar oleh @Max menjelaskan cara menemukan persen dari total varian.
whuber

1
@whuber Mungkin saya seharusnya menggunakan "kesalahan ketik" bukan "bug"? :-) " Comp.1, menyumbang 29% dari varians " salah dan harus membaca " Comp.1, menyumbang 46% dari varians "
Darren Cook

1
Terima kasih, Darren: Saya salah paham bahwa kebingungan itu ada dalam buku ini dan saya mengambil "bug" untuk merujuk ke Rperangkat lunak itu sendiri. Menemukan kesalahan itu adalah tangkapan yang bagus (saya harap Anda merasa senang mengetahui apa yang sebenarnya terjadi dengan PCA)!
whuber

5
Ya, ini adalah bug dalam buku. Ada beberapa tempat di mana saya menyalahgunakan penyimpangan standar alih-alih varian. (Misalnya, ada titik di mana kami menggunakan RMSE, bukan MSE untuk menghitung R-squared.) Saya berharap kami punya waktu untuk duduk dan memperbaiki bug semacam ini dalam waktu dekat.
John Myles White

Jawaban:


11

Gunakan summary.princompuntuk melihat "Proporsi Varian" dan "Proporsi Kumulatif".

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)

1
Terima kasih Joshua. Jadi komponen pertama sebenarnya 46% dari varian. Saya akan mengirimkan laporan bug ke buku.
Darren Cook

Bagaimana "Proporsi varian" dihitung? Angka yang ditampilkan adalah 0.4600083. Tapi sqrt(pca$sdev[1]/sum(pca$sdev))(kira-kira sqrt(29.1/133.2)) memberi 0,4673904.
Darren Cook

3
@ DarrenCook: sdevmenyiratkan bahwa Anda sedang melihat deviasi standar , yaitu akar kuadrat dari varians (atau , menggunakan notasi dari jawaban saya), yang seharusnya menjelaskan perbedaannya. Cobasaja. λipca$sdev[1]^2/sum(pca$sdev^2)
MånsT

2
@ DarrenCook: gunakan sumber ... stats:::print.summary.princompmenunjukkan kepada Anda bahwa itu kuadrat sdevkomponen, yang stats:::princomp.defaultmenunjukkan adalah sqrtnilai eigen.
Joshua Ulrich

11

Mereka harus berjumlah 100 %.

Varians total dari -variate variabel acak X dengan matriks kovarians Σ didefinisikan sebagai t r ( Σ ) = σ 11 + σ 22 + + σ p p .pXΣ

tr(Σ)=σ11+σ22++σpp.

λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0 matriks kovarians adalah positif-semidefinit , sehingga varian totalnya adalah non-negatif.

eiXeii1λi

Var(eiX)=eiΣei=λieiei=λi
k
(λ1++λkλ1++λp100) %
100 %k=hal

1
Apakah Anda melihat (lebih baru) komentar oleh @ Max untuk pertanyaan? Dia memakukan jawabannya.
whuber

@whuber: Saya belum melihatnya, terima kasih. Saya membuat komentar serupa dalam komentar atas jawaban Yosua.
MånsT

4

Berikut adalah beberapa kode R untuk melengkapi jawaban sebelumnya ( pca[["sdev"]]biasanya ditulis pca$sdev, tetapi menyebabkan kesalahan format pada snippet di bawah).

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

Jadi, seperti yang ditunjukkan oleh @Max, bekerja dengan varians alih-alih standar deviasi dan tidak lupa untuk membaginya dengan total varian menyelesaikan masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.