【機械学習_Python】主成分分析(PCA)

主成分分析(Principal Component Analysis、PCA)についてのメモ

【目次】

主成分分析とは


相関のある特徴量から、互いに無相関の合成変数を作る手法である。この合成変数を主成分(Principal components)という。
主成分は特徴量の数だけ作ることができ、p次元の特徴量からp個の主成分ができる。このうち寄与率の高い主成分を選択することで、情報量を保ったまま次元削減することができる。例えば13次元の特徴量から2個の主成分を取り出し、2次元データとする。

f:id:cochineal19:20210521134924p:plain:w300

なお、主成分分析では特徴量の分散共分散行列を使う方法と相関行列を使う方法がある。元データが基準化(平均0、分散1)されていれば結果は同じになる。
特徴量間で単位が異なったり、分散の大きさが異なる場合は相関行列を使う方法が良い。

主成分軸の作り方


簡単のため、特徴量  x_{1}, x_{2} の2次元データ(特徴量行列X)で考える。
主成分分析では、特徴量 X を重み係数 W の方向に射影した主成分 Z の軸を作成する。

\quad \verb|行列表現: | Z=W^{T}X
\quad \verb|第1主成分: | z_{1}=w_{1}x_{1} + w_{2}x_{2}

次の概念図の通り、射影した主成分軸上での分散が大きいほど元の特徴量の情報を保つことができるため、主成分軸の作成は『主成分 Z の分散を最大化する重み係数 W を見つける問題』となる。

f:id:cochineal19:20210522231219p:plain:w500

この際、重み係数 W に制約がないと \infty になってしまうため、慣習的に重み係数 W のノルム(長さ)を1にして計算する(重み係数は割合が分かればよい)。

 \quad ||W|| = \sqrt{w_{p1}^{2} + w_{p2}^{2} + ... + w_{pp}^{2}} = 1


分散の最大化(ラグランジュの未定乗数法)

第1主成分を作る場合

特徴量  x_{1}, x_{2} の2次元データ(特徴量行列X)から第1主成分を作ることを考える。
つまり、 \sqrt{w_{1}^{2} + w_{2}^{2}} = 1 の制約の下、第1主成分  z_{1} の分散  \sigma_{z_{1}}^{2} の最大化を考える。


先ず、第1主成分の分散は、元データの分散と共分散に重み係数を掛けた形に書き換えられる。

 \quad \sigma_{z_{1}}^{2} = \dfrac{1}{n} \sum \left( z_{1} - \bar{z_{1}} \right)^{2}

 \qquad \ = \dfrac{1}{n} \sum \{ \left(w_{1}x_{1} + w_{2}x_{2}\right) - \left(w_{1}\overline{x_{1}} + w_{2}\overline{x_{2}} \right) \}^{2}

 \qquad \ = \dfrac{1}{n} \sum \{ w_{1}\left(x_{1} + \overline{x_{1}}\right) - w_{2}\left(x_{2} + \overline{x_{2}} \right) \}^{2}

 \qquad \ = w_{1}^{2}\dfrac{1}{n}\sum \left( x_{1}-\overline{x_{1}}\right)^{2} + w_{2}^{2}\dfrac{1}{n}\sum \left( x_{2}-\overline{x}_{2}\right) ^{2} + 2w_{1}w_{2} \dfrac{1}{n}\sum \left( x_{1}-\overline{x}_{1}\right) \left( x_{2}-\overline{x}_{2}\right)

 \qquad \ = w_{1}^{2} \sigma _{x_{1}}^{2} + w_{2}^{2} \sigma _{ x_{2}}^{2} + 2w_{1}w_{2} \sigma _{  x_{1} x_{2} }


これを行列表現で一般化すると、重みベクトル W と分散共分散行列 V から次の通り記載でき、重み係数 W を求める問題は W^{T}VW を最大化する問題へと帰着する。

 \quad \sigma_{z_{1}}^{2} = W^{T}VW = \begin{bmatrix} w_{1} & \cdot \cdot \cdot & w_{p}\end{bmatrix} \begin{bmatrix} \sigma _{  x_{1} x_{1} } & \cdot \cdot \cdot & \sigma _{  x_{p} x_{1} } \\ \vdots & \ddots & \vdots \\ \sigma _{  x_{1} x_{p} } & \ldots & \sigma _{  x_{p} x_{p} } \end{bmatrix}\begin{bmatrix} w_{1} \\ \vdots \\ w_{p} \end{bmatrix}


ここに制約条件 ||W||=1 を設け、ラグランジュ関数(  \lambdaラグランジュ乗数)を導入し、

 \quad L\left( w_{1},w_{2},\lambda \right) = \left( w_{1}^{2} \sigma _{x_{1}}^{2} + w_{2}^{2} \sigma _{ x_{2}}^{2} + 2w_{1}w_{2} \sigma _{  x_{1} x_{2} } \right) - \lambda\left( w_{1}^{2}+w_{2}^{2}-1 \right)

 \qquad \qquad \qquad \quad \ =W^{T}VW- \lambda\left( W^{T}W-1 \right)

 w_{1}, w_{2}, \lambda偏微分より次を得る。

 \quad \dfrac{\partial L}{w_{1}}=2w_{1}\sigma _{x_{1}}^{2}+2w_{2}\sigma _{x_{1}x_{2}}-2w_{1}\lambda=w_{1}\sigma _{x_{1}}^{2}+w_{2}\sigma _{x_{1}x_{2}}-w_{1}\lambda=0

 \quad \dfrac{\partial L}{w_{2}}=2w_{2}\sigma _{x_{2}}^{2}+2w_{1}\sigma _{x_{1}x_{2}}-2w_{2}\lambda=w_{2}\sigma _{x_{1}x_{2}}+w_{1}\sigma _{x_{2}}^{2}-w_{2}\lambda=0

 \quad \dfrac{\partial L}{\partial \lambda }=-\left( w_{1}^{2}+w_{2}^{2}-1\right) =0


この重み係数  w_{1}, w_{2} の解について、変形して並べてみる。

 \quad w_{1}\sigma _{x_{1}}^{2}+w_{2}\sigma _{x_{1}x_{2}}=w_{1} \lambda

 \quad w_{1}\sigma _{x_{1}x_{2}}+w_{2}\sigma _{x_{2}}^{2}=w_{2} \lambda

これを行列表現で一般化すると次のようになる。

 \quad VW=W \lambda I

 \quad \begin{bmatrix} \sigma _{x_{1}x_{1}} & \ldots & \sigma _{x_{p} x_{1}} \\  \vdots & \ddots & \vdots \\ \sigma _{x_{1} x_{p}} & \ldots & \sigma _{x_{2}x_{2}} \end{bmatrix}\begin{bmatrix} w_{1} \\  \vdots \\ w_{p} \end{bmatrix}=\begin{bmatrix} w_{1} \\  \vdots \\ w_{p} \end{bmatrix}\begin{bmatrix} \lambda &  \ldots & 0  \\  \vdots & \ddots & \vdots \\ 0 & \ldots  & \lambda \end{bmatrix}


最後の式は、分散共分散行列  V固有値問題であり、固有値固有ベクトルはそれぞれ次に対応する。
・最大固有値  \lambda =主成分  z_{1} の分散  \sigma_{z_{1}}^{2}
固有ベクトル=重み係数  W

つまり、重み係数 W を求める問題は、分散共分散行列  V固有値問題に帰着する。
なお、標準化する場合、分散共分散行列でなく相関行列 R を用いる。


第p主成分を作る場合

第2主成分以上を作りたい場合も基本的な計算は変わらず、最終的には分散共分散行列  V固有値問題に帰着する。

 \quad VW=W \lambda I

 \quad \begin{bmatrix} \sigma _{x_{1}x_{1}} & \ldots & \sigma _{x_{p} x_{1}} \\  \vdots & \ddots & \vdots \\ \sigma _{x_{1} x_{p}} & \ldots & \sigma _{x_{2}x_{2}} \end{bmatrix}\begin{bmatrix} w_{1} \\  \vdots \\ w_{p} \end{bmatrix}=\begin{bmatrix} w_{1} \\  \vdots \\ w_{p} \end{bmatrix}\begin{bmatrix} \lambda &  \ldots & 0  \\  \vdots & \ddots & \vdots \\ 0 & \ldots  & \lambda \end{bmatrix}


なお、第2主成分は第1主成分、第3主成分は第1・第2主成分と直交する軸のうち分散を最大化する軸を求める。以降も同様。

ここで、固有値を大きい順に  \lambda_{1}, \lambda_{2}, ..., \lambda_{p} と並べ、対応する固有ベクトル w_{}, w_{2}, ... , w_{p} とすると、この並び順が第1主成分、第2主成分、・・第p主成分となる。先述の通り、最大固有値  \lambda _{1} が第1主成分である。


次元削減の基準

寄与率と累積寄与率

第k主成分でどのくらいの分散を表せているか(情報量があるか)を固有値を用いて「寄与率」という尺度で表すことができる。

 \quad \dfrac{\lambda_{k}}{\sum _{i=1}^{p} \lambda} = \dfrac{\lambda_{k}}{\lambda_{1}+\lambda_{2}+...+\lambda_{p}}

また、第1主成分から第k主成分までの寄与率の合計を「累積寄与率」という。

 \quad \dfrac{\sum _{j=1}^{k} \lambda_{j}}{\sum _{i=1}^{p} \lambda_{i}} = \dfrac{\lambda_{1}+\lambda_{2}+...+\lambda_{k}}{\lambda_{1}+\lambda_{2}+...+\lambda_{k}+...+\lambda_{p}}


この「累積寄与率」を十分に高く保てる範囲で次元削減する方法がある。一般的に80%、50%などあるが根拠があるわけではない。

カイザー基準とスクリー基準

分散の加法性により、基準化したデータセット(平均0、分散1)における分散の合計は、特徴量の数と等しくなる(2次元なら分散の合計は2、p次元なら分散の合計はp)。よって、固有値が1に満たないものは、特徴量1個分の情報量もないと考えることができる。このように固有値が1以上であるかで判断する方法を「カイザー基準」という。

また、固有値を大きい順に並べてプロットし、推移がゆるやかになるところまで選択する方法がある。この方法を「スクリー基準」と言い、この時の図をスクリープロットと言う。

f:id:cochineal19:20210523020003p:plain:w400

計算手順のまとめ


主成分分析~次元削減までの手順は、簡単に次の通りまとめられる。
①:p次元の特徴量行列 X を標準化(平均0、分散1)する。
②:①から相関行列 R を求める。
③:②から固有値  \lambda 固有ベクトル(重み係数  W )を求める。
④:③の固有値  \lambda を大きい順にk個取り出し、これらに対応する固有ベクトル(重み係数  W )を結合して特徴量の変換行列 D を作る。
⑤:④の変換行列 D を用いて①の特徴量行列 X を変換する。X'=XD

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

本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。