« Science 10/14 | メイン | 散髪 »

2005年10月14日

PCAとSVD

ブザキラボと、隣のケン・ハリスラボ(ケンはブザキ研出身なのでラボどうし仲がよい)は、数物系出身の理論家が多い。全体の1/3ぐらいが理論家かな。解析系のプログラムなどは、理論系の人がバリバリ書いてくれる。実験系の人は、プログラムの使い方は分かるが、しかし原理まではなかなか勉強できない。それで、ハリスラボのポスドクのカリーナ(彼女は数学出身)が実験系の人のために、解析用の数学を簡単に説明してくれる勉強会を毎週金曜にしてくれているらしい。その勉強会の存在を先日知ったので、今回から僕も参加させてもらうことにする。

今日のお話は、PCA(principal component analysis:主成分分析)と SVD(Singular Value Decomposition:特異値分解)の違いについて。カリーナが講義室で黒板を使って30分ぐらいで説明してくれる。

さすが数学出身だけあって、話がシンプルですごいわかりやすかった。内容を全部書きたいところだけど、webで数式を書くのは大変なので、省略してまとめてみます。(mimetexとかを入れればいいんだろうけど、入れ方が分からない。。)

N次元のデータが、n個あったとする(ただし、n >= N )。すなわち、

 y1 = (y11, y12,・・・, y1N )
 y2 = (y21, y22,・・・, y2N )
 ・・・
 yn = (yn1, yn2,・・・, ynN )

この、n行N列のデータ行列を A とおくとき、A の共分散行列は、

 AT A

で求められる(詳細は省略)。PCAは、この AT A の固有値問題に帰着される。

で、SVDは、行列 A に対して、 結局 AT A の固有値問題に帰着されるらしいので、要するに、PCAとSVDは同じことらしい。

AT A は当然 N×N の対象行列になるので、N個の非負固有値が存在するはずで、固有値問題が解けるわけですね。

ここまで分かれば、matlabで簡単にPCA解析できますね。普通に固有値・固有ベクトルを求める eig 関数を使ってもいいし、svdという関数があるのでそれを使えばもっと簡単ですね。

例えば、Aをn行N列のデータ行列とするとき、

 [U,S,V] = svd(A);

と入力すると、A=U S VT となるよう特異値分解してくれて、これはPCAを行っているのと等価なわけですね。(なんと一行でPCAができてしまう!)ここで、V は主成分結合係数ベクトルを並べた行列。データ行列を主成分軸の張る空間に移したければ、A*V(あるいは U*S)で計算できますね。

(↑これで正しい?)参考ページ。

投稿者 sfujisawa : 2005年10月14日 22:52

コメント

コメントしてください

サイン・インを確認しました、 . さん。コメントしてください。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?