PCA bileşenleri gerçekten varyans yüzdesini temsil ediyor mu? Toplamı% 100'den fazla olabilir mi?


13

O'Reilly'nin "Hackerlar İçin Makine Öğrenmesi" her temel bileşenin varyansın bir yüzdesini temsil ettiğini söylüyor. Aşağıdaki sayfanın ilgili kısmını alıntıladım (bölüm 8, s.207). Başka bir uzmanla görüştüklerinde, bunun yüzde olduğunu kabul ettiler.

Bununla birlikte, 24 bileşen% 133.2095'tir. Nasıl olabilir?

Kendimizi PCA kullanabileceğimize ikna ettikten sonra, bunu R'de nasıl yapabiliriz? Yine, bu R'nin parladığı bir yerdir: PCA'nın tamamı tek bir kod satırında yapılabilir. PCA'yı çalıştırmak için princomp fonksiyonunu kullanıyoruz:

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

R'ye sadece pca yazarsak, ana bileşenlerin hızlı bir özetini göreceğiz:

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.

Bu özette, standart sapmalar bize veri setindeki varyansın ne kadarının farklı ana bileşenler tarafından muhasebeleştirildiğini anlatmaktadır. Comp.1 adı verilen ilk bileşen varyansın% 29'unu, bir sonraki bileşen% 20'sini oluşturur. Sonunda, son bileşen olan Comp.24, varyansın% 1'inden daha azını oluşturur. Bu, yalnızca ilk temel bileşene bakarak verilerimiz hakkında çok şey öğrenebileceğimizi gösterir.

[Kod ve veriler github'da bulunabilir .]


6
Bence yazarın yorumu Standard deviationsbiraz kapalı. Standart sapmalar aslında standart sapmalar olduğundan, her bir bileşenin varyansın ne kadarını temsil ettiğini görmek için bunları kare haline getirmeliyiz. İlk bileşen , toplam varyansın yüzde oranını temsil edecektir. 100×29.1001249229.10012492++0.43479832
varsayılan

4
Bu soru iki temel hatadan kaynaklanıyor, korkarım: (1) sayıların "Standart sapmalar" olduğunu söyleyen başlığı kaçırır ve varyanslar için hata yapar ve (2) bu sayıların yüzde olduğunu varsayar, ama değildir. (Birimleri hisse senetlerinin ölçüldüğü her şeydir: yılda dolar veya yüzde değişim ya da her neyse.) Burada hiç bir hata yok: @Max'ın yorumu toplam varyansın yüzdesini nasıl bulacağını açıklıyor.
whuber

1
@whuber Belki de "hata" yerine "yazım hatası" kullanmalıydım? :-) " Comp.1, Varyans 29% 'ini " yanlış ve okumalısınız " Comp.1, Varyans 46%' ini "
Darren Cook

1
Teşekkür ederim Darren: Kitapta karışıklığın olduğunu yanlış anladım ve Ryazılımın kendisine atıfta bulunmak için "hata" aldım . Bu hatayı bulmak iyi bir şeydi (umarım PCA'da neler olup bittiğini bulmak için faydalı bulursunuz)!
whuber

5
Evet, bu tartışmasız kitaptaki bir hatadır. Varyanslar yerine standart sapmaları yanlış kullandığım birkaç yer var. (Örneğin, R kare hesaplamak için MSE yerine RMSE kullandığımız bir nokta var.) Yakın gelecekte oturup bu tür hataları düzeltmek için zamanımız olduğunu umuyorum.
John Myles White

Yanıtlar:


11

summary.princomp"Varyans Oranı" ve "Birikimli Oran" ı görmek için kullanın .

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

1
Teşekkürler Joshua. İlk bileşen aslında varyansın% 46'sıdır. Kitaba bir hata raporu göndereceğim.
Darren Cook

"Varyans oranı" nasıl hesaplanır? Gösterilen sayı 0.4600083'tür. Ancak sqrt(pca$sdev[1]/sum(pca$sdev))(kabaca sqrt(29.1/133.2)) 0.4673904 verir.
Darren Cook

3
@DarrenCook: sdevBaktığınız ima standart sapma (veya yani varyans karekökü, , cevabım gösterimi kullanılarak) farkını açıklamalıdır hangi. Bunun yerine deneyin . λipca$sdev[1]^2/sum(pca$sdev^2)
MånsT

2
@DarrenCook: source kullanın ... stats:::print.summary.princompsize özdeğerlerin sdevolduğunu stats:::princomp.defaultgösteren bileşenin karesini gösterir sqrt.
Joshua Ulrich

11

Toplamı100 %.

Bir toplam varyans -variate rasgele değişken ile kovaryans matrisi gibi tanımlanmıştırpXΣ

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

Şimdi, iz simetrik bir matris olarak özdeğerler toplamıdırBu nedenle, toplam varyans kullandığımız takdirde için göstermektedirler özdeğer . Not bu yana kovaryans matrisi pozitif yarı kesin olarak , toplam varyans olmayan negatif olacak şekilde yapılmıştır.λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

Ancak temel bileşenler tarafından verilen , olduğu (uzunluğa sahip standart inci özvektör: özdeğer karşılık gelen) . Varyansı ve bu nedenle ilk temel bileşenleri Toplam varyansın . Özellikle, olduğunda toplam varyansın oluştururlar .e i i 1 λ i V a r ( e i X ) = e i Σ e i = λ i e i e i = λ i k ( λ 1 + + λ keiXeii1λi

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

1
@Max'ın soruya (daha yeni) yorumunu gördün mü? Cevabı çiviledi.
whuber

@whuber: Görmedim, çok teşekkürler. Joshua'nın cevabına yaptığı bir yorumda da benzer bir açıklama yaptım.
MånsT

4

İşte önceki cevapları tamamlamak için bazı R kodları ( pca[["sdev"]]genellikle yazılmıştır pca$sdev, ancak aşağıdaki snippet'te yanlış biçimlendirmeye neden olur).

# 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)

Yani @Max'ın belirttiği gibi, standart sapma yerine varyansla çalışmak ve toplam varyansa bölünmeyi unutmamak sorunu çözer.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.