Loading [MathJax]/extensions/tex2jax.js

主成分分析(PCA)sklearnとpython

機械学習




主成分分析とは

主成分分析は、観測変数から新しい変数(主成分という)を合成する分析手法です。

複数の観測変数を単純化し、標本が持っている情報をうまく要約します。

主成分は、観測データと直線との垂線の距離を最小になるような直線を引く。

(以下のようにも言える)
観測データの重心を通るように、最も散らばっている(分散の大きい)ところに直線を引く。

観測データの持つ情報量(主成分の固有値)が最大になるようなところに直線を引く。

主成分分析では、一般的に第1主成分・第2主成分を使って、2次元のグラフで表す。

主成分分析の流れ

  1. 主成分と主成分得点を求める
  2. 分析結果の制度を確認する
  3. 分析結果を検討する

説明変数uとし、主成分Zとする。

$$Z = a_1u_1 + a_2u_2 + \cdots +a_pu_p$$
aは、Zへの影響度と解釈できる。

  1. 変数ごとに標準化
  2. 相関行列を求める
  3. 相関行列SSは、正方行列でもあり、対称行列でもある。

  4. 固有値、固有ベクトルを求める
  5. $$SSx = \lambda x$$

    $$\lambda = (\lambda_1, \cdots, \lambda_n)$$
    $$u = (u_1, \cdots, u_n)$$

    \(\lambda\)は、固有値
    uは、固有ベクトルです。

    第k主成分の寄与率
    $$\frac{\lambda_k}{変数の個数}\times 100$$

プログラムでPCA

アルゴリズム

  1. 標準化
  2. 共分散行列
  3. 共分散行列の固有値を固有ベクトルを取得
  4. 次元数kを決める
  5. 上位k個の固有ベクトルの行列W
  6. 行列Wから、特徴ベクトルを取得する

skleanでPCA

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
 
cancer = load_breast_cancer()
train_X, val_X, train_y, val_y = train_test_split(cancer.data, cancer.target, test_size=0.3, random_state=0)
 
#PCA
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
std.fit(train_X)
 
std_train_X = std.transform(train_X)
std_val_X = std.transform(val_X)
 
from sklearn.decomposition import PCA
 
pca = PCA(n_components=2)
 
pca.fit(std_train_X)
 
pca_train_X = pca.transform(std_train_X)
pca_val_X = pca.transform(std_val_X)

numpyだけでPCA

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
 
cancer = load_breast_cancer()
train_X, val_X, train_y, val_y = train_test_split(cancer.data, cancer.target, test_size=0.3, random_state=0)
 
#標準化
std_value = train_X.std(axis=0)
mean_value = train_X.mean(axis=0)
s_train_X = (train_X - mean_value) / std_value
s_val_X = (val_X - mean_value) / std_value
 
#共分散行列
covs = np.cov(s_train_X.T)
 
#共分散行列の固有値と固有ベクトル
eigen_vals, eigen_vecs = np.linalg.eig(covs)
 
#次元数ncを決める
nc = 2
vals = eigen_vals[:nc]
vecs = eigen_vecs[:,:nc]
 
p_train_X = s_train_X.dot(vecs)
p_val_X = s_val_X.dot(vecs)

参考


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


機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム- (Machine Learning)

タイトルとURLをコピーしました