読者です 読者をやめる 読者になる 読者になる

UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Pythonで主成分分析を実行する

f:id:mochizuki_p:20161020203741p:plain

主成分分析(PCA)

たくさんの情報で表現されるデータがある。

これをより少ない情報で表現できないか?

データを分割して大きいモノから並べて小さいモノは無視すればいい?

これを主成分分析(PCA)と呼ぶ

この手の分析はRで行うのが一般的とされているが、今回はPython3で実行する。

最初にPythonの科学計算ライブラリをsklearnpipでインストールする

pip3 install sklearn

次にこのライブラリから主成分分析用のモジュールをインポート

from sklearn.decomposition import PCA

次に今回の分析に利用するサンプルデータirisを読み込む

from sklearn import datasets

data = datasets.load_iris().data

次が一番重要な部分で、n_componentsで削減先の次元を指定する。irisは4次元のデータなので2次元まで落とすことになる。

pca = PCA(n_components=2)

そして実行

pca.fit(data)

最初に次元削減後のデータがどのように表現されたかをここでみることができます。

print(pca.transform(data))

結果は

[[-2.68420713  0.32660731]
 [-2.71539062 -0.16955685]
 [-2.88981954 -0.13734561]
.

.

.

 [ 1.90162908  0.11587675]
 [ 1.38966613 -0.28288671]]

これは寄与率で先頭から順番にi番目の固有ベクトルで元のデータをどれだけ表現できたかを表します。

print(pca.explained_variance_ratio_)

中身は

[ 0.92461621  0.05301557]

つまり最初の1つで約92%が説明できることになります。

最後に各固有ベクトルの値を確認してみることにします。

print(pca.components_)

これを元の座標系にプロットすれば(4次元なので難しいですが)主成分の向きが分かることになります。

主成分分析ではこれを因子負荷量と呼ぶことがあります。つまり各変数の各主成分への影響力を表す指標として、各主成分の意味の推定を行うことに使われるわけです

[[ 0.36158968 -0.08226889  0.85657211  0.35884393]
 [ 0.65653988  0.72971237 -0.1757674  -0.07470647]]

与えられたベクトル分布を近似する部分空間を求める手法(次元削減) 具体的には分散を最大化する。 別名 KL展開(Karhunen-Loeve展開)

理論

D次元のN個のベクトル集合{ X = { x_1,x_2,...,x_N } }を考える。目的の次元をMとする。 また{\Sigma}{X}の分散共分散行列{(N \times N)}実対称行列なので対角化が可能 また{\Lambda}を各対角成分に固有値をもつ {(N \times N)}の正方行列とする

ここで固有ベクトル{\phi}は直交して{ {\phi}_i  \cdot {\phi}_j = 1 (i = j) }かつ{ {\phi}_i  \cdot {\phi}_j = 0 (i \neq j) }を満たす したがって{{\Phi}^T {\Phi} = I, {\Phi}^{-1} = {\Phi}^T}{(D \times D)} 次元の正方行列

これより すなわち {{\Phi}{\Sigma}{\Phi} = {\Lambda}}

最後に固有ベクトル集合{\Phi}による{x}の写像{y}を考える

{y = {\Phi}^T x}

{x = {\Phi} y}

これで固有ベクトル行列によるxの写像yによってxを表現することができました。

最後にこれでは次元が削減できていないように見えます。そこで対応する固有値が大きい固有ベクトルの順に、目標とする次元の数まで残すことで次元を削減する手法が主成分分析です。

評価法  M (< D)次元で元のD次元空間をどれだけ再現できたかを見る。つまり第M主成分まで利用して計算したときの {x^{'}} の値 { x^{'} = {\Phi}_{M}  x }がxの何%か?ということです。これは前述の寄与率のことでirisの例の場合は第一主成分までで92%、第二主成分までで97%が説明できることになります。

最後にコード全体を

from sklearn.decomposition import PCA

from sklearn import datasets

data = datasets.load_iris().data



pca = PCA(n_components=2)

pca.fit(data)



print(pca.transform(data))

print(pca.explained_variance_ratio_)

print(pca.components_)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)