主成分分析(Principal Component Analysis、PCA)についてのメモ
【目次】
主成分分析とは
相関のある特徴量から、互いに無相関の合成変数を作る手法である。この合成変数を主成分(Principal components)という。
主成分は特徴量の数だけ作ることができ、p次元の特徴量からp個の主成分ができる。このうち寄与率の高い主成分を選択することで、情報量を保ったまま次元削減することができる。例えば13次元の特徴量から2個の主成分を取り出し、2次元データとする。
なお、主成分分析では特徴量の分散共分散行列を使う方法と相関行列を使う方法がある。元データが基準化(平均0、分散1)されていれば結果は同じになる。
特徴量間で単位が異なったり、分散の大きさが異なる場合は相関行列を使う方法が良い。
主成分軸の作り方

分散の最大化(ラグランジュの未定乗数法)
第1主成分を作る場合
先ず、第1主成分の分散は、元データの分散と共分散に重み係数を掛けた形に書き換えられる。
最後の式は、分散共分散行列
・最大固有値
・固有ベクトル=重み係数
つまり、重み係数
なお、標準化する場合、分散共分散行列でなく相関行列
第p主成分を作る場合
なお、第2主成分は第1主成分、第3主成分は第1・第2主成分と直交する軸のうち分散を最大化する軸を求める。以降も同様。
次元削減の基準
寄与率と累積寄与率
第k主成分でどのくらいの分散を表せているか(情報量があるか)を固有値を用いて「寄与率」という尺度で表すことができる。
また、第1主成分から第k主成分までの寄与率の合計を「累積寄与率」という。
この「累積寄与率」を十分に高く保てる範囲で次元削減する方法がある。一般的に80%、50%などあるが根拠があるわけではない。
カイザー基準とスクリー基準
分散の加法性により、基準化したデータセット(平均0、分散1)における分散の合計は、特徴量の数と等しくなる(2次元なら分散の合計は2、p次元なら分散の合計はp)。よって、固有値が1に満たないものは、特徴量1個分の情報量もないと考えることができる。このように固有値が1以上であるかで判断する方法を「カイザー基準」という。
また、固有値を大きい順に並べてプロットし、推移がゆるやかになるところまで選択する方法がある。この方法を「スクリー基準」と言い、この時の図をスクリープロットと言う。
計算手順のまとめ
主成分分析~次元削減までの手順は、簡単に次の通りまとめられる。
①:p次元の特徴量行列 を標準化(平均0、分散1)する。
②:①から相関行列 を求める。
③:②から固有値 、固有ベクトル(重み係数
)を求める。
④:③の固有値 を大きい順にk個取り出し、これらに対応する固有ベクトル(重み係数
)を結合して特徴量の変換行列
を作る。
⑤:④の変換行列 を用いて①の特徴量行列
を変換する。
Pythonコード
sklearn の decomposition にある PCA で主成分分析ができる。
次元削減したい場合は PCA の n_components で指定する。例:2次元データに圧縮する。PCA(n_components=2)
from sklearn.decomposition import PCA import numpy as np #-- 標準化 X = (X - X.mean(axis=0)) / X.std(axis=0) #-- 主成分分析 pca1 = PCA() #-- 次元数を指定する場合、n_components X_pca1 = pca1.fit_transform(X) #-- 分析 print("-- 固有値(主成分の分散) --") print(pca1.explained_variance_) print("-- 固有ベクトル(重み係数W) --") print(pca1.components_) print("-- 寄与率 --") print(pca1.explained_variance_ratio_)
参考
統計学(出版:東京図書), 日本統計学会編
高橋 信, 井上 いろは, マンガでわかる統計学 [因子分析編], トレンドプロ
市川 伸一 他, SASによるデータ解析入門 [第3版], 東京大学出版会
sklearn.decomposition.PCA — scikit-learn 0.24.2 documentation
http://www.ie.reitaku-u.ac.jp/~tak/datB/datB_prin00.pdf
http://manabukano.brilliant-future.net/document/text-PCA.pdf
http://web.wakayama-u.ac.jp/~wuhy/am10.pdf