主成分分析(PCA)

【関連記事】

主成分分析(PCA)とは

あらすじ

1回の測定で$p$種類の測定値が得られる測定を$n$回行ったとする.

このとき得られたデータを,$p$次元のベクトルで表される$n$個のデータ$\{\bm{x}_{i} = {}^{t}\!(x_{i1},\ldots,x_{ip})\}_{i = 1}^{n}$を並べた「データ行列」

\begin{aligned}
X=
\begin{pmatrix}
{}^{t}\! \bm{x}_{1} \\
\vdots \\
{}^{t}\! \bm{x}_{n}
\end{pmatrix}
=
\begin{pmatrix}
x_{11} & x_{12} & \cdots & x_{1p} \\
\vdots & \vdots & \ddots & \vdots \\
x_{n1} & x_{n2} & \cdots & x_{np}
\end{pmatrix}
\end{aligned}
として表すことにする($X_{ij} =x_{ij} = \bm{x}_{i}$の第$j$成分$=(\bm{x}_{i})_{j}$).

主成分分析(PCA)の目的は,新しい正規直交基底$\{\bm{w}_{k}\}_{k}$を用いて

\begin{aligned}
\bm{x}
&= \sum_{k=1}^{p} y_{k} \bm{w}_{k} \\
\end{aligned}
のように分解し,少ない$q$で
\begin{aligned}
\bm{x}
&\simeq \sum_{k=1}^{\textcolor{red}{q}} y_{k} \bm{w}_{k} \\
\end{aligned}
と表すことである($y_{k} = \bm{x}\cdot \bm{w}_{k}$).このとき,$\bm{w}_{k}$をローディングベクトル(第$k$主成分),$y_{k}$を主成分スコアと呼ぶ.

同じことをデータ行列$X$で表現すれば,

\begin{aligned}
X& =
\sum_{k=1}^{p}
\begin{pmatrix}
Y_{k1} \\
\vdots \\
Y_{kn}
\end{pmatrix}
(w_{k1},\ldots,w_{kp})
\end{aligned}
のように分解し,少ない$q$で
\begin{aligned}
X\simeq
\sum_{k=1}^{\textcolor{red}{q}}
\begin{pmatrix}
Y_{k1} \\
\vdots \\
Y_{kn}
\end{pmatrix}
(w_{k1},\ldots,w_{kp})
\end{aligned}
と表すことになる.

ここで,この式の$i$行目は

\begin{aligned}
& (\text{$i$番目のデータ${}^{t}\!\bm{x}_{i} = (x_{i1},\ldots,x_{ip})$}) \\
&= \sum_{k=1}^{p} Y_{ki} {}^t\bm{w}_{k} \\
& = \sum_{k=1}^{p} \overbrace{(\text{$i$番目のデータの${}^t\bm{w}_{k}$に対する重み$Y_{ki}$})}^{\text{スコア}} \\
&\qquad \quad \times (\text{$p$個の特徴量をどれだけ拾ってくるか} \\
&\qquad \qquad \underbrace{\quad\text{指定する重み${}^t\bm{w}_{k}$}) \qquad\qquad\qquad\qquad}_{\text{ローディング (第$k$主成分)}}
\end{aligned}
という構造になっている($W_{ij}=w_{ij}=(\bm{w}_{j})_{i}$).


考え方(分散の最大化)

$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}^{p} w_{\textcolor{red}{1}k} x_{ik}
= (w_{\textcolor{red}{1}1},\ldots ,w_{\textcolor{red}{1}p} )
\begin{pmatrix}
x_{i1} \\
\vdots \\
x_{ip}
\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}}$を求めたら,元データを$\{\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}
は$p\times p$実対称行列であるから,直交行列$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$主成分スコア=ローディング×元データ=元データ$\bm{x}$の$\bm{w}_{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}
のように,「元データ$\bm{x}$」を「主成分スコア(重み)$y_{k}$」と「ローディング(新しい基底)$\bm{w}_{k}$」に分解できる.

この転置を取ると

\begin{aligned}
{}^{t}\!\bm{x}
= {}^{t}\!\bm{y} W
\end{aligned}
あるいは
\begin{aligned}
(x_{1},\ldots x_{p})
=(y_{1},\ldots y_{p})
\begin{pmatrix}
{}^{t}\!\bm{w}_{1} \\
\vdots \\
{}^{t}\!\bm{w}_{p}
\end{pmatrix}
\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{w}_{k}\}_{k}$はデータによらず共通だが,スコア$\{y_{k}\}_{k}$はデータごとに異なるため行列になる.

$\bm{Y}_{k}$は,データ$1,\ldots ,n$の第$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}
\end{pmatrix}
%\\
%{}^{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} \\
=\sum_{i=1}^{n} \bm{e}_{i}
{}^{t}\!\bm{x}_{i} \\
& \bm{e}_{i} =
\left(
\begin{array}{c}
0 \\
\vdots \\
1\\
\vdots \\
0
\end{array}
\right) (i~~~
\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.12.0 Manualで計算できる(特異値は$\sigma_{1} \geq \sigma_{2} \geq \cdots \geq \sigma_{p}$の順に算出される).


参考文献