Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

主成分分析

主成分分析は学習データの分散が最大になる方向への線形変換を求める手法。

DD次元のデータx=(x1,⋯ ,xD)T\boldsymbol{x}=(x_1, \cdots, x_D)^TがNN個あるとする。ii番目の観測値を行ベクトルxi\boldsymbol{x}_iとして表し、データを行列X=(x1,⋯ ,xN)TX = (\boldsymbol{x}_1, \cdots, \boldsymbol{x}_N)^Tと表す。

各変数の平均のベクトルxˉ=(xˉ1,...,xˉD)T\bar{\boldsymbol{x}}=(\bar{x}_1, ..., \bar{x}_D)^Tを引き算した行列をXˉ=(x1−xˉ,...,xN−xˉ)T\bar{\boldsymbol{X}}=(\boldsymbol{x}_1 - \bar{\boldsymbol{x}}, ..., \boldsymbol{x}_N - \bar{\boldsymbol{x}})^Tとおけば、共分散行列Σ\boldsymbol{\Sigma}は

Σ=Var⁡[Xˉ]=1NXˉTXˉ\boldsymbol{\Sigma} = \operatorname{Var}[\bar{\boldsymbol{X}}] = \frac{1}{N} \bar{\boldsymbol{X}}^T \bar{\boldsymbol{X}}

で定義される。

係数ベクトルaj=(aj1,...,ajD)T (j=1,...,D)\boldsymbol{a}_j = (a_{j1}, ..., a_{jD})^T \ (j=1, ..., D)を用いてXˉ\bar{X}を線形変換したベクトルをsj\boldsymbol{s}_jとする。

sj=(s1j,...,sNj)T=Xˉaj\boldsymbol{s}_j = (s_{1j}, ..., s_{Nj})^T = \bar{\boldsymbol{X}} \boldsymbol{a}_j

このデータの分散は

Var⁡[sj]=1NsjTsj=1N(Xˉaj)TXˉaj=1NajTXˉTXˉaj=ajTVar⁡[Xˉ]aj\begin{aligned} \operatorname{Var}[\boldsymbol{s}_j] &= \frac{1}{N} \boldsymbol{s}_j^T \boldsymbol{s}_j\\ &= \frac{1}{N} (\bar{\boldsymbol{X}} \boldsymbol{a}_j)^T \bar{\boldsymbol{X}} \boldsymbol{a}_j\\ &= \frac{1}{N} \boldsymbol{a}_j^T \bar{\boldsymbol{X}}^T \bar{\boldsymbol{X}} \boldsymbol{a}_j\\ &= \boldsymbol{a}_j^T \operatorname{Var}[\bar{\boldsymbol{X}}] \boldsymbol{a}_j\\ \end{aligned}

となる。

このままmax⁡ajVar⁡[sj]\max_{\boldsymbol{a}_j} \operatorname{Var}[\boldsymbol{s}_j]を解くと単にaj=∞\boldsymbol{a}_j=\inftyが解になってしまうので、係数ベクトルaj\boldsymbol{a}_jのノルム制約条件をかけた最大化問題を解くことにする。

この分散が最大となる射影ベクトルは、ラグランジュ関数

L(aj)=ajTVar⁡[Xˉ]aj−λ(ajTaj−1)L(\boldsymbol{a}_j) = \boldsymbol{a}_j^T \operatorname{Var}[\bar{\boldsymbol{X}}] \boldsymbol{a}_j - \lambda (\boldsymbol{a}_j^T \boldsymbol{a}_j - 1)

を最大にするaj\boldsymbol{a}_jである。(λ\lambdaはラグランジュ未定乗数)

微分して0とおけば

∂L(aj)∂aj=2Var⁡[Xˉ]aj−2λaj=0\frac{\partial L(\boldsymbol{a}_j)}{\partial \boldsymbol{a}_j} = 2 \operatorname{Var}[\bar{\boldsymbol{X}}] \boldsymbol{a}_j - 2 \lambda \boldsymbol{a}_j = 0

より

Var⁡[Xˉ]aj=λaj\operatorname{Var}[\bar{\boldsymbol{X}}] \boldsymbol{a}_j = \lambda \boldsymbol{a}_j

となる。

このλ\lambdaとaj\boldsymbol{a}_jは固有値問題を解くことにより得られる。

計算例

今回は次のデータを使って計算の例を示していく

Source
<Figure size 640x480 with 1 Axes>

データ行列X=(x1,...,xN)T\boldsymbol{X} = (\boldsymbol{x}_1, ..., \boldsymbol{x}_N)^Tから平均ベクトルを引き算した行列をXˉ=(x1−xˉ,...,xN−xˉ)T\bar{\boldsymbol{X}}=(\boldsymbol{x}_1 - \bar{\boldsymbol{x}}, ..., \boldsymbol{x}_N - \bar{\boldsymbol{x}})^Tとおけば、共分散行列Σ\boldsymbol{\Sigma}は

Σ=Var⁡[Xˉ]=1NXˉTXˉ\boldsymbol{\Sigma} = \operatorname{Var}[\bar{\boldsymbol{X}}] = \frac{1}{N} \bar{\boldsymbol{X}}^T \bar{\boldsymbol{X}}

と推定できる

array([[1.00140312, 0.32999238], [0.32999238, 0.54438079]])

固有値分解

分散最大化問題の解は

Var⁡[Xˉ]aj=λaj\operatorname{Var}[\bar{\boldsymbol{X}}] \boldsymbol{a}_j = \lambda \boldsymbol{a}_j

であったので、固有値問題を解いてλ\lambdaとaj\boldsymbol{a}_jを推定していく。


λ=[1.17427995 0.37150396]
a1=[0.886 0.464]
a2=[-0.464  0.886]

主成分を表す固有ベクトルの傾きに直線をプロットすると以下の通り。

Source
<Figure size 640x480 with 1 Axes>

推定できたa\boldsymbol{a}の任意の次元数を使って線形変換s=Xˉa\boldsymbol{s} = \boldsymbol{\bar{X}} \boldsymbol{a}を作る

<Figure size 640x480 with 1 Axes>

寄与率

次元削減を行う際は、元の分散を多く説明している(=固有値λj\lambda_jが大きい)次元を残すようにすればよい

array([1.17427995, 0.37150396])
array([0.7596663, 0.2403337])
array([0.7596663, 0.2403337])
array([[ 2.28345887, 0.61668615], [ 0.15906083, -0.49935839], [ 0.77927075, -0.56227195]])
array([[ 2.28345887, 0.61668615], [ 0.15906083, -0.49935839], [ 0.77927075, -0.56227195]])