PCAのコンポーネントは実際に分散の割合を表しますか?合計すると100%を超えることはできますか?


13

O'Reillyの「Machine Learning For Hackers」は、各主成分が分散の割合を表すと述べています。以下のページの関連部分を引用しました(8章、207ページ)。別の専門家に話すと、彼らはそれがパーセンテージであることに同意しました。

ただし、24個のコンポーネントの合計は133.2095%になります。それはどうしてですか?

PCAを使用できると確信しましたが、Rでそれを行うにはどうすればよいですか?繰り返しますが、これはRが輝く場所です。PCA全体を1行のコードで実行できます。princomp関数を使用してPCAを実行します。

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

Rにpcaと入力するだけで、主要なコンポーネントの簡単な要約が表示されます。

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.

この要約では、標準偏差は、さまざまな主成分によってデータセットの分散がどの程度考慮されるかを示しています。Comp.1と呼ばれる最初のコンポーネントは分散の29%を占め、次のコンポーネントは20%を占めます。最後に、最後のコンポーネントであるComp.24は、分散の1%未満を占めています。これは、最初の主成分を見るだけでデータについて多くのことを学べることを示唆しています。

[コードとデータはgithubにあります。]


6
著者の解釈Standard deviationsは少しずれていると思います。標準偏差は実際には標準偏差であるため、各コンポーネントが表す分散の量を確認するには、それらを平方する必要があります。最初のコンポーネントは100 × 29.1001249 2を表します全分散の 2%。100×29.1001249229.10012492++0.43479832
想定

4
この質問は、2つの基本的な間違いから生じています。私は恐れています:(1)数値が「標準偏差」であることを告げる見出しを逃し、それらを分散と間違えます。(それらの単位は、株式の測定単位:年ごとのドルまたはパーセントの変化などです。)ここにはまったくバグはありません。@ Maxのコメントは、合計分散のパーセントを見つける方法を説明しています。
whuber

1
@whuberおそらく「バグ」の代わりに「タイプミス」を使用すべきだったのでしょうか?:-)「Comp.1は、分散の29%を占め、」間違っていると読むべき「Comp.1を、分散の46%を占め、」
ダレン・クック

1
ありがとう、ダレン:本の中に混乱が存在していると誤解し、Rソフトウェア自体を参照するために「バグ」を取りました。そのエラーを見つけることは良いキャッチでした(PCAで実際に何が起こっているのかを知ることは、あなたがそれがやりがいのあることを発見したことを望みます)!
whuber

5
はい、これは間違いなく本のバグです。分散の代わりに標準偏差を誤用した場所がいくつかあります。(たとえば、R-squaredの計算にMSEの代わりにRMSEを使用するポイントがあります。)近い将来、これらの種類のバグを修正する時間があることを望んでいます。
ジョンマイルズホワイト

回答:


11

summary.princomp「分散の割合」と「累積割合」を表示するために使用します。

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

1
ジョシュアありがとう。したがって、最初の成分は実際には分散の46%です。本にバグレポートを送ります。
ダレン・クック

「分散の割合」はどのように計算されますか?表示される数値は0.4600083です。しかしsqrt(pca$sdev[1]/sum(pca$sdev))(大体sqrt(29.1/133.2))0.4673904になります。
ダレン・クック

3
@DarrenCookは:sdevあなたが見ていることを意味し、標準偏差すなわち分散の平方根、(またはλpca$sdev[1]^2/sum(pca$sdev^2)

2
@DarrenCook:ソースを使用... stats:::print.summary.princompは、sdevコンポーネントを2乗することをstats:::princomp.default示しsqrtます。これは、固有値のことです。
ジョシュアウルリッヒ

11

100 %.

pXΣ

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

現在、対称行列のトレースはその固有値の合計ですλ1λ2λp.

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

しかし、主要成分はで与えられる、ここでE iはあるI(長有するように標準化番目の固有ベクトル:1の固有値に対応します)λ I。その分散は V aeiXeii1λi

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

1
質問に対する@Maxの(最近の)コメントを見ましたか?彼は答えを打ちました。
whuber

@whuber:見たことがないので、ありがとう。ジョシュアの答えへのコメントで同様の発言をしました。
MånsT

4

これpca[["sdev"]]は、以前の回答を補完するためのRコードです(通常は記述されてpca$sdevいますが、以下のスニペットでフォーマットの誤りを引き起こします)。

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

したがって、@ Maxが指摘しているように、標準偏差ではなく分散を使用し、合計分散で除算することを忘れないことで問題が解決します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.