🦔

主成分分析の理論

に公開

対象読者

この資料は、主成分分析の理論を知りたい人に向けに書きました。

という資料構成になっていますので、必要な箇所を読んで行ってください。

主成分分析について

主成分分析とは

主成分分析とは、多次元のデータを少量の新しい変数(主成分)に変換して、データの構造をわかりやすくする統計手法です。
具体的には、データの分散が大きくなるような基底ベクトルをいくつか計算し、データを圧縮します。

例えば

あなたが教師を務める学校で、

  • 生徒全員が同じような点数を取ったテスト
  • 生徒全員がばらばらの点数を取ったテスト

があったとします。

このテスト結果から優秀な生徒を見極めるためには、生徒全員がばらばらの点数を取ったテストを重視すべきです。なぜなら、生徒全員が同じような点数を取ったテストでは、生徒の優秀さよりも生徒のケアレスミスを大きく反映していると考えられるからです。

これは即ち「ばらばらの度合いが大きい(分散が大きい)ほど情報量が多い」ということであり、ここから考えられた次元圧縮方法が主成分分析です。

主成分分析は、データの分散共分散行列に対する固有値問題として与えられるのですが、この資料ではその導出を行っています。

主成分分析の具体例

30人の生徒がいるクラスで、国語、数学のテスト結果から、「優秀さ」を表す軸を作ることを目的に、主成分分析を行ってみました。

具体例

30人の国語と数学のテスト結果を表す行列が以下のように与えられたとします。

\mathbb{X} = \begin{pmatrix} 82 & 76 & 76 & 78 & 80 & 80 & 78 & 75 & 80 & 79 & 83 & 80 & 79 & 80 & 73 & 77 & 82 & 81 & 79 & 78 & 86 & 82 & 80 & 86 & 76 & 82 & 80 & 80 & 83 & 80 \\ 59 & 55 & 57 & 58 & 61 & 55 & 54 & 55 & 58 & 59 & 56 & 60 & 56 & 63 & 59 & 52 & 64 & 65 & 61 & 64 & 65 & 69 & 55 & 62 & 57 & 67 & 62 & 58 & 67 & 55 \end{pmatrix}

1行目が国語のテスト結果、2行目が数学のテスト結果で、各列が1人の生徒を表しています。

このデータを標準化して主成分分析を行うと、第1主成分として以下の基底が得られました。

一般的には「テストの合計点」=「優秀さ」と評価していますが、主成分分析を行うことで、教科ごとに適切な重み付けした優秀さを表す指標を作ることができます。

主成分分析の理論

取り扱う問題

主成分分析の目的は「データの分散が最も大きくなるような基底を探す」ことです。
n 個のデータ \bm{x_i} を、ある基底 \bm{e} に写したとき、分散は以下のようになります。

s = \frac{1}{n} \sum_{i=1}^{n} ( \bm{x_i}^{\mathrm{T}} \bm{e} - \bm{\bar{x}_i}^{\mathrm{T}}\bm{e} )^2

ここで、\bm{\bar{x}_i} は、各データの平均を要素にもつベクトルです。
データが標準化されているとすれば、平均が 0 なので以下のように書き直すことができます。

s = \frac{1}{n} \sum_{i=1}^{n} (\bm{x_i}^{\mathrm{T}} \bm{e})^2

ここで \bm{e} が基底であることを考慮すると(\bm{e}^{\mathrm{T}}\bm{e} = 1)主成分分析の問題は以下のように書くことができます。

ラグランジュ未定乗数法

ラグランジュ未定乗数法

「条件 g(x, y)=0 のもとで、関数 f(x, y) が最大となるような x, y を求める」
という問題は、まさにラグランジュ未定乗数法で解けることが知られています。

ラグランジュ未定乗数法とは、g(x, y)=0 のもとで f(x, y) が最大となるとき、
f(x,y) の等高線における偏微分と、g(x,y) における偏微分の向きが一致すること、つまり

\nabla f = \lambda \nabla g, \quad \lambda \in \mathbb{R}

を利用した、非常にエレガントな解き方です。
参考(wikipedia)

主成分分析の問題では、ラグランジュ未定乗数法の g, f が以下のように対応しています。

\begin{aligned} g(\bm{e}) &= \bm{e}^{\mathrm{T}}\bm{e} - 1 = 0\\ f(\bm{e}) &= \frac{1}{n} \sum_{i=1}^{n} (\bm{x_i}^{\mathrm{T}} \bm{e})^2 \end{aligned}

f(\bm{e}) を少し変形すると、問題は以下のように書き換えられます。

式変形
\begin{aligned} f(\bm{e}) &= \frac{1}{n} \sum_{i=1}^{n} (\bm{x_i}^{\mathrm{T}} \bm{e})^2 \\ &= \frac{1}{n} \sum_{i=1}^{n} \left( (x_{i1}, x_{i2}, \dots , x_{im}) \begin{pmatrix} e_{1} \\ e_{2} \\ \vdots \\ e_{m} \end{pmatrix} \right)^2 \\ &= \frac{1}{n} \sum_{i=1}^{n} (e_{1}, e_{2}, \dots , e_{m}) \begin{pmatrix} x_{i1} \\ x_{i2} \\ \vdots \\ x_{im} \end{pmatrix} (x_{i1}, x_{i2}, \dots , x_{im}) \begin{pmatrix} e_{1} \\ e_{2} \\ \vdots \\ e_{m} \end{pmatrix}\\ &= \frac{1}{n} \sum_{i=1}^{n} \bm{e}^{\mathrm{T}} \bm{x_i}\bm{x_i}^{\mathrm{T}} \bm{e} \\ &= \frac{\bm{e}^{\mathrm{T}} }{n} \sum_{i=1}^{n}\bm{x_i}\bm{x_i}^{\mathrm{T}} \bm{e} \\ \end{aligned}

ここで、行列を

\bm{C} = \frac{1}{n} \sum_{i=1}^{n} \bm{x_i}\bm{x_i}^{\mathrm{T}}

とおくと、

f(\bm{e}) = \bm{e}^{\mathrm{T}} \bm{C} \bm{e}

固有値問題

この偏微分を計算すると、

\begin{aligned} \nabla \left( \bm{e}^{\mathrm{T}} \bm{C} \bm{e} \right) &= \lambda \nabla \left( \bm{e}^{\mathrm{T}}\bm{e} - 1 \right) \\ 2 \bm{C} \bm{e} &= 2 \lambda \bm{e} \\ \therefore \bm{C} \bm{e} &= \lambda \bm{e} \end{aligned}

となり、以下のような固有値問題が得られます。

この問題を解くことで、多次元のデータを少量の新しい基底を用いて低次元に圧縮することができ、この操作を主成分分析と呼びます。

分散共分散行列について

〜を満たす行列を分散共分散行列と呼びます。

ここを書く

固有値が分散となることの説明

後に説明する「寄与度」や「累積寄与度」の計算において、固有値 \lambda が重要な役割を果たすため \lambda の意味について説明しておきます。

データを基底 \bm{e} に写した時の分散が

s = \frac{1}{n} \sum_{i=1}^{n} (\bm{x_i}^{\mathrm{T}} \bm{e})^2 = \bm{e}^{\mathrm{T}} \bm{C} \bm{e}

であったことを思い出すと

s = \bm{e}^{\mathrm{T}} \bm{C} \bm{e} = \bm{e}^{\mathrm{T}} \lambda \bm{e} = \lambda

より、固有値 \lambda は、基底 \bm{e} に対する分散を表している、ということがわかります。

関連用語と計算方法

寄与度

主成分分析の結果、計算した固有値 \lambda を大きいものから順に \lambda_1, \lambda_2, \dots, \lambda_i と呼ぶことにすると、 j 番目の寄与度は以下のように定義されます。

\frac{\lambda_j}{\sum^{i}_{k=1} \lambda_k}

つまり寄与度は、j 番目に分散を大きく残す基底が、全体の分散をどの程度説明できるかを示す割合になっています。

累積寄与度

累積寄与度は、j 番目までの寄与度の合計を表します。

\frac{\sum^{j}_{l=1} \lambda_l}{\sum^{i}_{k=1} \lambda_k}

つまり累積寄与度は、j 番目までの基底を用いて、全体の分散をどの程度説明できるかを示す割合になっています。

GitHubで編集を提案

Discussion