主成分分析

1+

多変量の、量的データの変量の合成に用いられる主成分分析。
計算の中身を追ってみました。

(1)相関行列の算出

もとデータより、相関行列を算出します。
Statistics: 分散共分散行列と相関行列

主成分分析の入力データには、
分散共分散行列と、相関行列の2種があります。
今回は標準化済みの相関行列を用います。
標準化が不要な場合は、
分散共分散行列を用いるのがよいでしょう。

(2)固有値・固有ベクトルの算出

相関行列を対象に、固有値・固有ベクトルを算出します。
固有値、固有ベクトルについては、こちらを参照。
Statistics: 固有ベクトルと固有値

固有ベクトルが、主成分(軸)の方向に対応します。
固有値は、主成分の分散に対応しており、
主成分が保持している情報の大きさを示しています。

なお、主成分分析は、多次元の分布を想定した際、
最も分散の大きい方向を探す分析ですが、
「分散の大きい方向を探す」 ことは、
「固有値問題を解く」 ことと、等しくなります。

その説明については、こちらに示されています。
http://racco.mikeneko.jp/Kougi/10s/AS/AS06pr.pdf

(3)主成分得点の算出

サンプルのプロットに用いる、主成分得点を算出します。
主成分得点は主成分軸上での、座標を意味します。
そのため、もともとの基底から、
固有ベクトルを基底と取るように、基底変換を行います。
基底変換については、こちら。
Statistics: 基底変換

なお、今回は相関行列を対象としているため、
データについても、標準化を行います。

R での計算例

上記の主成分分析の手続きを、Rで処理してみます。
今回はRのデータセット、attitude を使用します。

1.相関行列の算出を行います。

c<-cor(attitude);

2.固有値・固有ベクトルの算出を行います。

e<-eigen(c);

3.主成分得点の算出を行います。
固有ベクトルを用いて、基底変換を行います。
基底変換についてはこちらを参照。
Statistics: 基底変換

また、列方向にデータが並んでしまうため、転置します。
なお、attitude は scale 関数で標準化しています。

s<-solve(e$vectors) %*% t(scale(attitude));
s<-t(s);

4.結果の比較
主成分分析のライブラリ prcomp の結果と比較します。

p<-prcomp(attitude, scale=T);
cbind(s[,1], p$x[,1]);


なお、3の主成分得点の算出については、
リンク先の基底変換の式にあわせて、転置を行いました。
しかし、以下のように、かける順番を入れ替えることで、
転置が不要になります。

s<-scale(attitude) %*% t(solve(e$vectors));

また、今回は相関行列を用いましたが、
分散共分散行列を用いた例は、こちらになります。
attitude に対し、標準化ではなく中心化をしており、
また prcomp も同様にscale=F を指定しています。

c<-cov(attitude);
e<-eigen(c);
s<-scale(attitude, scale=F) %*% t(solve(e$vectors));
p<-prcomp(attitude, scale=F);
cbind(s[,1], p$x[,1]);

ほか、今回は prcomp の計算結果と一致するように、
「主成分得点の不偏分散が固有値と一致する」 例を
挙げました。

R には他に主成分分析のための関数として、
princomp、また FactoMineR の PCA があります。

これらからは、
「主成分得点の標本分散が固有値と一致する」
結果が得られます。

これら、主成分分析の出力結果の違いについては、
こちらにまとめました。

Statistics: Rでの主成分分析の結果の違いについて

以上です。


参考資料

F.4.31. 主成分分析
http://www.wakayama-u.ac.jp/~wuhy/am12.pdf
http://www.jaist.ac.jp/~t-yama/K116/MA09-05.pdf
http://www.macromill.com/landing/words/b007.html
http://www5.ocn.ne.jp/~shinya91/csm/331csm_multi.html

カテゴリー:


1+