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

技術メモ

役に立てる技術的な何か、時々自分用の覚書。統計学、機械学習、神経科学、暗号理論...と幅広く興味があります。

scikit-learnで主成分分析(累積寄与率を求める)

機械学習 Python

pythonのライブラリでおなじみ、scikit-learnで主成分分析をする方法。
最終的には累積寄与率をプロットできるようにしたい。

基本

import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")

import sklearn.decomposition # PCAで使うはこれだけ
import sklearn.datasets


data = sklearn.datasets.load_digits(n_class=5) # sklearnに付属の手書き文字データ
pca = sklearn.decomposition.PCA(n_components=2)
pca.fit(data.data)

ここで用意したデータはscikitlearnに付属している手書き文字データ。今回はプロットしやすいようにラベル数は5個にしておいた。
基本的な(主成分分析を扱う)部分は最後の2行だけ。

※seabornって何?って思った人はこちら:グラフが綺麗に描けるpythonのライブラリseabornを使うとグラフを描くのが楽しくなる - 技術メモ

2成分プロット

第一主成分と第二主成分を軸にとって二次元プロットする方法。

pca_point = pca.fit_transform(data.data)
colors = ["r","b","g","c","m"]
for i, point in enumerate(pca_point):
    color = colors[data.target[i]]
    plt.scatter(*point,marker='.',color=color)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.show()

重要なところは最初の一行。元データを主成分でなす空間に射影する関数。
f:id:swdrsker:20161216022815p:plain
ラベルごとに色分けしてプロットするうまい方法は他にあるかもしれない。
第2主成分まででも結構分けられるんだね。

寄与率・累積寄与率

第一成分、第二成分の基底ベクトルの具体的な値を見る

pca.components_

寄与率を見て、累積寄与率をプロットしてみる。

pca = sklearn.decomposition.PCA()
pca.fit(data.data)
ev_ratio = pca.explained_variance_ratio_
ev_ratio = np.hstack([0,ev_ratio.cumsum()])
plt.plot(ev_ratio)
plt.show()

今回は第3成分以降も取りたかったので引数は与えない形にした。
寄与率は3行目の方法で出てくる。これはnumpyのarrayで格納されているので、numpyの累積和を求める関数(cumsum())が使えるというのがポイント。また、あえて先頭に0を加えることで原点を通るようにしている。
f:id:swdrsker:20161216022840p:plain:w500