主成分分析(PCA)

主成分分析(PCA)とは

考え方(分散の最大化)

$p$次元のベクトルで表される$n$個のデータ$\{\bm{x}_{i} = {}^{t}\!(x_{i1},\ldots,x_{ip})\}_{i = 1}^{n}$が得られたとする.このデータの違いを最もよく見えるような座標変換をしたい.

これは,$\|\bm{w}_{\textcolor{red}{1}}\| = 1$を満たす変数変換

\begin{aligned}
y_{i \textcolor{red}{1}}
&= \sum_{k = 1}^{n} w_{\textcolor{red}{1}k} x_{ik}
= (w_{\textcolor{red}{1}1},\ldots ,w_{\textcolor{red}{1}n} )
\begin{pmatrix}
x_{i1} \\
\vdots \\
x_{in}
\end{pmatrix} \\
&= {}^{t}\!\bm{w}_{\textcolor{red}{1}} \bm{x}_{i} = {}^{t}\! \bm{x}_{i} \bm{w}_{\textcolor{red}{1}}
\end{aligned}
によって,分散
\begin{aligned}
\frac{1}{n} \sum_{i = 1}^{n} (y_{i \textcolor{red}{1}} - \bar{y})^{2}
&= {}^{t}\! \bm{w}_{\textcolor{red}{1}}
\biggl[\frac{1}{n} \sum_{i = 1}^{n} (\bm{x}_{i} - \bar{\bm{x}}) {}^{t}\!(\bm{x}_{i} - \bar{\bm{x}}) \biggr]
\bm{w}_{\textcolor{red}{1}}
\end{aligned}
が最大になるものを求めることに対応する.

$\bm{w}_{\textcolor{red}{1}}$を求めたら,これに直交する空間

\begin{aligned}
\bigl\{\bm{x}_{i} - \bigl(\bm{x}_{i} \cdot \bm{w}_{1} \bigr) \bm{w}_{1} \bigr\}_{i = 1}^{n}
\end{aligned}
に対して同じことをして$\bm{w}_{2}$を求める.

あとは,これを繰り返して$\bm{w}_{1},...,\bm{w}_{p}$を計算する.つまり,$\bm{w}_{1},...,\bm{w}_{k - 1}$まで求めたら,

\begin{aligned}
\biggl\{\hat{\bm{x}}_{i} = \bm{x}_{i} - \sum_{j=1}^{k - 1} (\bm{x}_{i} \cdot \bm{w}_{j} ) \bm{w}_{j} \biggr\}_{i = 1}^{n}
\end{aligned}
の変数変換
\begin{aligned}
y_{i \textcolor{red}{k}}
&= {}^{t}\!\bm{w}_{\textcolor{red}{k}} \tilde{\bm{x}}_{i}
\end{aligned}
で分散を最大にするような$\bm{w}_{\textcolor{red}{k}}$を求める.


考え方(対角化)

対角化の手法を使うと,上のような繰り返しを行うことなく,主成分を一度に求めることができる.

標本分散共分散行列

\begin{aligned}
S
&= \frac{1}{n} \sum_{i = 1}^{n} (\bm{x}_{i} - \bar{\bm{x}}) {}^{t}\!(\bm{x}_{i} - \bar{\bm{x}})
\end{aligned}
は実対称行列であるから,直交行列$W = (\bm{w}_{1}, \ldots,\bm{w}_{p})$により対角化が可能で,
\begin{aligned}
{}^{t}\!W S W
&= \Lambda \\
&=
\begin{pmatrix}
\lambda_{1} & 0 & \cdots & 0 \\
0 & \lambda_{2} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_{p}
\end{pmatrix} \\
& (\lambda_{1} \geq \lambda_{2} \geq \cdots \geq \lambda_{p})
\end{aligned}
と表せる.

$S\bm{w}_{k} = \lambda_{k}\bm{w}_{k} \Leftrightarrow {}^{t}\!\bm{w}_{k} S\bm{w}_{k} = \lambda_{k}$であるから,第$k$主成分が

\begin{aligned}
y_{k} = {}^{t}\!\bm{w}_{k} \bm{x} = {}^{t}\! \bm{x} \bm{w}_{k}
\end{aligned}
となる(第$k$主成分スコア=ローディング×元データ).

主成分スコアをまとめてベクトルで表すと

\begin{aligned}
& {}^{t}\!\bm{y} = (y_{1},\ldots,y_{p}) \\
& = {}^{t}\! \bm{x} (\bm{w}_{1},\ldots,\bm{w}_{p}) \\
&= {}^{t}\! \bm{x} W
\end{aligned}
となる.よって,各データを縦に並べれば,後で定義するデータ行列を使って
\begin{aligned}
Y = XW
\end{aligned}
と表せる.

元データの分解

\begin{aligned}
& {}^{t}\!\bm{y} = {}^{t}\!\bm{x} W \\
&\Leftrightarrow \bm{y} = {}^{t}\! W \bm{x} \\
&\Leftrightarrow \bm{x} = W \bm{y} = \sum_{k=1}^{p} y_{k} \bm{w}_{k}
\end{aligned}
のように,元データを主成分スコアとローディングに分解できる.

同じことをデータ行列で表すと,

\begin{aligned}
X
&=Y {}^{t}\! W \\
&=(\bm{Y}_{1},\ldots, \bm{Y}_{p})
\begin{pmatrix}
{}^{t}\!\bm{w}_{1} \\
\vdots \\
{}^{t}\!\bm{w}_{p}
\end{pmatrix} \\
&=\sum_{k=1}^{p} \bm{Y}_{k} {}^{t}\!\bm{w}_{k}
\end{aligned}
となる(上で得た$\bm{x} = \sum_{k=1}^{p} y_{k} \bm{w}_{k}$の転置をとって,縦に並べたものと同じ).

データ行列を使った表現

Principal component analysis - Wikipediaでは,上記をデータ行列$X$を使って表している.データ行列$X$は,
\begin{aligned}
X = (\bm{X}_{1},\ldots, \bm{X}_{p})
&=
\begin{pmatrix}
{}^{t}\!\bm{x}_{1} \\
\vdots \\
{}^{t}\!\bm{x}_{n}
%\\
% {}^{t}\! X &= (\bm{x}_{1}, \ldots, \bm{x}_{n}) \\
% &=
% \begin{pmatrix}
% x_{11} & \cdots & x_{1n} \\
% \vdots & \ddots & \vdots \\
% x_{p1} & \cdots & x_{pn}
\end{pmatrix}
\end{aligned}
で定義される.つまり,データを1行ずつ上から並べたものになっている.

同様に変数変換後のデータ行列を

\begin{aligned}
Y = (\bm{Y}_{1},\ldots, \bm{Y}_{p})
&=
\begin{pmatrix}
{}^{t}\!\bm{y}_{1} \\
\vdots \\
{}^{t}\!\bm{y}_{n}
\end{pmatrix}
\end{aligned}
で表す.

この表記で上の議論を見直すと,第一主成分に対応するのは

\begin{aligned}
\bm{Y}_{\textcolor{red}{1}}
&=
\begin{pmatrix}
{}^{t}\!\bm{x}_{1} \\
\vdots \\
{}^{t}\!\bm{x}_{n}
\end{pmatrix}
\bm{w}_{\textcolor{red}{1}}
= X \bm{w}_{\textcolor{red}{1}}
\end{aligned}
である.

また,「分散の最大化」の方法で$k$番目に考えるデータ行列は

\begin{aligned}
\begin{pmatrix}
{}^{t}\!\hat{\bm{x}}_{1} \\
\vdots \\
{}^{t}\!\hat{\bm{x}}_{n}
\end{pmatrix}
&=
\begin{pmatrix}
{}^{t}\!\bm{x}_{1} \\
\vdots \\
{}^{t}\!\bm{x}_{n}
\end{pmatrix}
- \sum_{j=1}^{k - 1}
\begin{pmatrix}
{}^{t}\!\bm{x}_{1} \bm{w}_{j} \\
\vdots \\
{}^{t}\!\bm{x}_{n} \bm{w}_{j}
\end{pmatrix}
{}^{t}\!\bm{w}_{j} \\
&=X - \sum_{j=1}^{k - 1} X \bm{w}_{j} {}^{t}\!\bm{w}_{j}
\end{aligned}
となる.

特異値分解との関係

主成分分析(PCA)は特異値分解を利用して実装できる.

データ$\{\bm{x}_{i} = {}^{t}\!(x_{i1},\ldots,x_{ip})\}_{i = 1}^{n}$の中心化されたデータ行列を

\begin{aligned}
X_{\mathrm{c}}
=
\begin{pmatrix}
{}^{t}\! (\bm{x}_{1} - \bar{\bm{x}}) \\
\vdots \\
{}^{t}\! (\bm{x}_{n} - \bar{\bm{x}})
\end{pmatrix}
,\quad
\biggl(\bar{\bm{x}} = \frac{1}{n} \sum_{i = 1}^{n} \bm{x}_{i} \biggr)
\end{aligned}
とする.

標本分散共分散行列は

\begin{aligned}
S
&= \frac{1}{n} \sum_{i = 1}^{n} (\bm{x}_{i} - \bar{\bm{x}}) {}^{t}\!(\bm{x}_{i} - \bar{\bm{x}}) \\
&= \frac{1}{n} {}^{t}\!X_{\mathrm{c}} X_{\mathrm{c}}
\end{aligned}
と表せる.

$X_{\mathrm{c}}$の特異値分解を

\begin{aligned}
X_{\mathrm{c}}
&=U\Sigma {}^{t}\!V
\end{aligned}
とする.ここで
  • $X_{\mathrm{c}}$: $n\times p$行列(階数$p$)
  • $U = (\bm{u}_{1},\ldots,\bm{u}_{p})$: $n\times p$行列で$\bm{u}_{i} \cdot \bm{u}_{j} = \delta_{ij}$を満たす.
  • $\Sigma = \begin{pmatrix} \sigma_{1} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \sigma_{p} \end{pmatrix}$: $p\times p$対角行列($\sigma_{1} \geq \sigma_{2} \geq \cdots \geq \sigma_{p}$とする).
  • $V =(\bm{v}_{1},\ldots,\bm{v}_{p}) $: $p\times p$行列で$\bm{v}_{i} \cdot \bm{v}_{j} = \delta_{ij}$を満たす(つまり,直交行列である).
である.

特異値分解により

\begin{aligned}
S
&= \frac{1}{n} {}^{t}\!X_{\mathrm{c}} X_{\mathrm{c}} \\
&= \frac{1}{n} V {}^{t}\!\Sigma {}^{t}\! U U\Sigma {}^{t}\!V \\
&= \frac{1}{n} V \Sigma^{2} {}^{t}\!V \\
&= V
\begin{pmatrix}
\sigma_{1}^{2}/n & 0 & \cdots & 0 \\
0 & \sigma_{2}^{2}/n & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \sigma_{p}^{2}/n
\end{pmatrix}
{}^{t}\!V
\end{aligned}
と表せる.これを「考え方(対角化)」の表式と見比べれば,
  • $W = V$
  • $\lambda_{i} = \sigma_{i}^{2}/n$
であることがわかる.

Pythonでは,特異値分解をscipy.linalg.svd — SciPy v1.10.0 Manualで計算できる(特異値は$\sigma_{1} \geq \sigma_{2} \geq \cdots \geq \sigma_{p}$の順に算出される).


参考文献