PCA(主成分分析)を理解する(理論編)


はじめに

今回はPCA(主成分分析)について勉強した内容をまとめました。
基礎的な多変量解析の手法であり、かつ機械学習の次元削減にも多用される手法です。

参考

主成分分析の理解に当たって下記を参考にさせていただきました。

主成分分析

主成分分析とは何か

主成分分析は、抽象的に言うと「ある問題対して複数の要因が考えられるとき、それらの要因を1つ1つ独立に扱うのではなく、総合的に取り扱うことを試みる分析手法」です。
もう少し数式を用いた表現にすると、各変数$x_1, x_2, x_3, \cdots, x_p$をできるだけ元々の情報を損なわないように、総合指標$z_1, z_2, z_3, \cdots, z_m$(定義は下記)に変換する手法です。


z_{1}=a_{11}x_1+a_{12}x_2 + a_{13}x_2 + \cdots + a_{1p}x_p \\
z_{2}=a_{21}x_1+a_{22}x_2 + a_{23}x_2 + \cdots + a_{2p}x_p \\
\vdots\\
z_{m}=a_{m1}x_1+a_{m2}x_2 + a_{m3}x_2 + \cdots + a_{mp}x_p \\

$z_1$が第1主成分、$z_2$が第2主成分、$z_m$が第m主成分、となります。

主成分を求める

主成分分析で解くタスク

下記のようなデータをサンプルとして主成分を求めていきます。

サンプル 人口10万人当たりのスポーツ施設$x_{1}$ 人口10万人当たりの教育施設$x_{2}$
埼玉 22.9 13.7
千葉 24.9 16.2
東京 19.3 11.3
神奈川 22.0 10.4
茨城 28.6 24.9
栃木 42.6 26.5
群馬 41.3 20.3

主成分分析のそ目的は、データの情報をできるだけ多く残したまま(情報の損失量を最小限に抑えながら)主成分$z$を定めることです。
これを解くべきタスクに置き換えると、「$z$がもとのデータ情報をできるだけ多く有する」→「データ全体のバラツキをできるだけ$z$に反映させる」→「$z$の分散を最大化する」ということになります。

上記のデータの場合は2変数となので、主成分は$z=a_{1}x_1+a_{2}x_2$で与えられます。それぞれの説明変数$x_{1}$ $x_{2}$の平均を$\overline x_{1}$ $\overline x_{2}$置くと、主成分の平均は$a_{1}\overline x_1+a_{2}\overline x_2$です。

下記で主成分の分散$V(a_{1},a_{2})$を求めていきます。

V(a_{1},a_{2})=\frac{1}{6}[\{{(22.9a_{1} + 13.7a_{2})-(24.9a_{1} + 16.2a_{2}) \}}^2\\   
+\{{(24.9a_{1} + 16.2a_{2})-(28.8a_{1} + 17.6a_{2}) \}}^2\\
\vdots\\
+\{{(41.3a_{1} + 20.8a_{2})-(28.8a_{1} + 17.6a_{2}) \}}^2]\\
=88.87a_{1}^{2}+41.42a_{2}^{2}+97.46a_{1}a_{2}

そこに、$a_{1}^2+a_{2}^2=1$という条件を付けて(この条件を付与しなければ無限に分散は増大する)$V(a_{1},a_{2})$を最大化するような$a_{1},a_{2}$を求めることができれば完了です。

ラグランジュ未定乗数法

制約付きの最大化問題の定石として、ラグランジュ未定乗数法を用います。
(ラグランジュ未定乗数法とは?という方はこちら)

G(a_{1},a_{2},\lambda)=V(a_{1},a_{2})-\lambda(a_{1}^2+a_{2}^2-1)

とおき、$a_{1},a_{2},\lambda$で$G(a_{1},a_{2},\lambda)$を偏微分すると下記のようになります。


{\begin{split}\begin{aligned}

\frac{\partial G}{\partial a_{1}} 
&=2(88.97a_{1} + 48.73a_{2} - \lambda a_{1}) \\

\frac{\partial G}{\partial a_{2}} 
&=2(48.73a_{1} + 41.42a_{2} - \lambda a_{1}) \\

\frac{\partial G}{\partial \lambda} 
&=-(a_{1}^2 + a_{2}^2 - 1) \\


\end{aligned}\end{split}
}

各式をそれぞれ$0$と置いて、連立方程式の形にします。


88.97a_{1} + 48.73a_{2} - \lambda a_{1} = 0 \\
48.73a_{1} + 41.42a_{2} - \lambda a_{1} = 0 \\
a_{1}^2 + a_{2}^2 = 1

上2つの式ですが、行列で表すとこのようになります。


{\begin{split}\begin{aligned}
\begin{bmatrix}
88.87 & 48.73 \\
48.73 & 41.42 \\
\end{bmatrix} \\
\end{aligned}\end{split}
\begin{split}\begin{aligned}
\begin{bmatrix}
a_{1} \\
a_{2} \\
\end{bmatrix} \\
\end{aligned}\end{split}

=

\begin{split}\begin{aligned}
\lambda
\begin{bmatrix}
a_{1} \\
a_{2} \\
\end{bmatrix} \\
\end{aligned}\end{split}


}

実は左側の行列は説明変数$x_{1} x_{2}$の分散共分散行列の形になっています。
加えて上記の式自体が固有値・固有ベクトルの式になっています。
(固有値・固有ベクトルって?というかたはこちら)
従って、

$\lambda = $ 分散共分散行列の固有値
$\begin{split}
\begin{bmatrix}
a_{1} \
a_{2} \
\end{bmatrix} ^T\
\end{split}
=$ 分散共分散行列の固有ベクトル

となっていることがわかります。
また、上記の連立方程式を組み合わせることで下記のような式が導出可能です。


88.97a_{1}^2 + (48.73a_{1}a_{2} + 48.73a_{1}a_{2}) + 41.42a_{2}^2 - \lambda( a_{1}^2 + a_{2}^2) = 0 \\
88.97a_{1}^2 + 97.46a_{1}a_{2} + 41.42a_{2}^2  = \lambda 

ここでもう一度主成分の分散の式を思い出します。


V(a_{1},a_{2})=88.87a_{1}^{2}+41.42a_{2}^{2}+97.46a_{1}a_{2}

実は主成分の分散の値は説明変数の分散共分散行列の固有値$\lambda$の値と一致しています。
つまり解くべきタスクは、「主成分の分散が最大の時の係数$a_{1}, a_{2}$求める」→「最大固有値$\lambda$に属する固有ベクトル$\begin{bmatrix}a_{1} a_{2} \end{bmatrix} ^T$を求める」ということになります。

主成分を求める


{\begin{split}\begin{aligned}
\begin{bmatrix}
88.87 & 48.73 \\
48.73 & 41.42 \\
\end{bmatrix} \\
\end{aligned}\end{split}
\begin{split}\begin{aligned}
\begin{bmatrix}
a_{1} \\
a_{2} \\
\end{bmatrix} \\
\end{aligned}\end{split}

=

\begin{split}\begin{aligned}
\lambda
\begin{bmatrix}
a_{1} \\
a_{2} \\
\end{bmatrix} \\
\end{aligned}\end{split}

}

行列式は下記のようになります。


\begin{vmatrix}
88.87-\lambda &  48.73\\
48.73 & 41.42-\lambda
\end{vmatrix}

この行列式を解くと、$\lambda_{1}=119.3 $ $\lambda_{2}=10.93$という解を得ることができます。
最大固有値である$\lambda_{1}=119.3$の固有ベクトルを求めると、


\begin{bmatrix}a_{1} a_{2} \end{bmatrix} ^T=\begin{bmatrix}0.8479 ,0.5301 \end{bmatrix} \\
\begin{bmatrix}a_{1} a_{2} \end{bmatrix} ^T=\begin{bmatrix}-0.8479 ,-0.5301 \end{bmatrix}

このようになります。
このことから主成分$z$は$z = 0.8479x_{1}+0.5301x_{2}$と表せることがわかります。
(二番目に大きい固有値に属する固有ベクトルを求めると、それを係数とした式が第二主成分の式となります。)

多変数の場合の主成分分析

説明変数が増えた場合も同様の手順で主成分を求めます。

個体と変数 $x_{1}$ $x_{2}$ ・・・ $x_{p}$
1 $x_{11}$ $x_{21}$ ・・・ $x_{p1}$
2 $x_{12}$ $x_{22}$ ・・・ $x_{p1}$
・・・ ・・・ ・・・
n $x_{1n}$ $x_{2n}$ ・・・ $x_{pn}$

上記のようなデータがあるとします。
初めに上記のデータの分散共分散行列$S$を求めます。


{
\begin{split}\begin{aligned}
s=
\begin{bmatrix}
s_{1}^2 & s_{12} & \cdots & s_{1p} \\
s_{12} & s_{2}^2 & \cdots & s_{2p} \\
\vdots \\
s_{1p} & s_{2p}  & \cdots & s_{p}^2
\end{bmatrix} \\
\end{aligned}\end{split}
}

そしてこの分散共分散行列$S$の固有値$\lambda$を求めます。
下記の行列式を解くことで固有値$\lambda$を求めることができます。


{
\begin{vmatrix}
s_{1}^2 - \lambda& s_{12} & \cdots & s_{1p} \\
s_{12} & s_{2}^2 - \lambda & \cdots & s_{2p} \\
\vdots \\
s_{1p} & s_{2p}  & \cdots & s_{p}^2 - \lambda
\end{vmatrix} 
=0
}

上記の行列式を解くと固有値$\lambda$は$p$個の解を持ちます。
$\lambda_{1} \geq \lambda_{2} \geq \lambda_{3} \dots \geq \lambda_{p} \geq 0$
導出されたそれぞれの固有値は上記のように並べ替えられ、数値の大きい固有値に属する固有ベクトルから順に第1主成分の係数、第2主成分の係数...というかたちになっていきます。


{
\begin{split}\begin{aligned}
\begin{bmatrix}
s_{1}^2 & s_{12} & \cdots & s_{1p} \\
s_{12} & s_{2}^2 & \cdots & s_{2p} \\
\vdots \\
s_{1p} & s_{2p}  & \cdots & s_{p}^2
\end{bmatrix} \\
\end{aligned}\end{split}

\begin{split}\begin{aligned}
\begin{bmatrix}
a_{i1}  \\
a_{i2}  \\
\vdots \\
a_{1p} 
\end{bmatrix} 
\end{aligned}\end{split}

=

\begin{split}\begin{aligned}
\lambda_{i}
\begin{bmatrix}
a_{i1}  \\
a_{i2}  \\
\vdots \\
a_{1p} 
\end{bmatrix} 
\end{aligned}\end{split}

}

上記の式に導出した固有値を代入し、固有ベクトルを導出します。
但し2変数の時と同様、次のような条件付きとなります。$a_{i1}^2 + a_{i2}^2 + \dots + a_{ip}^2 = 1$

すると、最大固有値$\lambda_{1}$の固有ベクトルに対して、
第1主成分$z_{1}=a_{11}x_1+a_{12}x_2 + a_{13}x_2 + \cdots + a_{1p}x_p$を得ることができます。
続けて、2番目に大きい固有値とその固有ベクトル、3番目に大きい固有値とその固有ベクトルというかたちで次々と主成分を求めていくことができます。

寄与率と累積寄与率

ある特定の主成分の寄与率(その主成分によってデータ全体の何%を説明できるか。)は下記のように定義されます。

\frac{\lambda_{i}}{\lambda_{1}+\lambda_{2}+\dots+\lambda_{p}}

第1主成分からある特定の主成分までの寄与率を累積寄与率(第1主成分からその主成分までによってデータ全体の何%を説明できるか。)と呼び、下記のように定義されます。

\frac{\lambda_{1}+\lambda_{2}+\dots+\lambda_{i}}{\lambda_{1}+\lambda_{2}+\dots+\lambda_{p}}

Next

上記で概ね主成分分析の理論について説明できました。
各変数の単位が異なる場合にはデータを標準化した後に主成分分析を行う必要がありますが、基本的な手順は上記と同じです。
次はPythonでの実装に挑戦したいと思います。