主成分分析(PCA)の理解 理論編

機械学習

This article is available in: English

はじめに

 主成分分析とは、お互いに相関のある特徴量について観測した多次元データのもつ情報をできるだけ失うことなく、もとの特徴量の線形結合で表される新たな特徴量へ要約する手法です。

機械学習で分類するデータは、3次元を大きく上回るような高次元のデータとなることが多いです。そのため、データの可視化は困難となり、計算コストもかかります。

そのような場合でも主成分分析を用いることで、次元圧縮を行い、1次元直線、2次元平面、3次元空間に射影して、データ構造を視覚的に把握することができます。

 この記事では主成分分析の基本的な理論を説明します。

\begin{align*}
\newcommand{\mat}[1]{\begin{pmatrix} #1 \end{pmatrix}}
\newcommand{\f}[2]{\frac{#1}{#2}}
\newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}}
\newcommand{\d}[2]{\frac{{\rm d}#1}{{\rm d}#2}}
\newcommand{\T}{\mathsf{T}}
\newcommand{\(}{\left(}
\newcommand{\)}{\right)}
\newcommand{\{}{\left\{}
\newcommand{\}}{\right\}}
\newcommand{\[}{\left[}
\newcommand{\]}{\right]}
\newcommand{\dis}{\displaystyle}
\newcommand{\eq}[1]{{\rm Eq}(\ref{#1})}
\newcommand{\n}{\notag\\}
\newcommand{\t}{\ \ \ \ }
\newcommand{\argmax}{\mathop{\rm arg\, max}\limits}
\newcommand{\argmin}{\mathop{\rm arg\, min}\limits}
\def\l<#1>{\left\langle #1 \right\rangle}
\def\us#1_#2{\underset{#2}{#1}}
\def\os#1^#2{\overset{#2}{#1}}
\newcommand{\case}[1]{\{ \begin{array}{ll} #1 \end{array} \right.}
\definecolor{myblack}{rgb}{0.27,0.27,0.27}
\definecolor{myred}{rgb}{0.78,0.24,0.18}
\definecolor{myblue}{rgb}{0.0,0.443,0.737}
\definecolor{myyellow}{rgb}{1.0,0.82,0.165}
\definecolor{mygreen}{rgb}{0.24,0.47,0.44}
\end{align*}

基本的な考え方

 主成分分析は、多次元データに内包する情報という概念を「分散」で捉えて、情報を失うことなく新たな特徴量を定義していく方法です。まずは簡単のため、2次元データに基づいて主成分分析を説明します。 2次元データ ​​$​​\bm{x} = (x_1, x_2)^\T$ を次の軸上へ射影することを考えます。すなわち、元々の2次元データを次式に代入して1次元のデータとします。

\begin{align}
\label{eq:proj}
y = w_1x_1 + w_2x_2.
\end{align}

 例として、下図に3つの射影軸(a), (b), (c)を想定して、観測された2次元データをそれぞれの軸上に射影し、データの散らばる範囲を黒矢印 <—-> で示しています。

この図からデータは(a)軸へ射影するよりも、(b)軸へ射影する方がデータの散らばり具合(分散)が大きくなり、(b)軸よりも(c)軸に射影する方がさらに分散が大きくなることが分かります。

 このように、主成分分析ではデータの分散が最大となる射影軸を求め、そこに射影してやることで、データの情報をなるべく失うことなく次元を削減します。 特に分散が最大となる射影軸を「第1主成分」と呼び、また、第1主成分と直行する条件の下で分散が最大となる射影軸を「第2主成分」呼びます。

 では、射影した際にデータの分散が最大となる軸はどのように求めれば良いのでしょうか。2次元データに基づいて主成分分析の定式化を行ってみましょう。

主成分分析の定式化

 観測された $n$ 個の2次元データを下記のように表します。

\begin{align}
\bm{x}^{(1)} = \mat{x_1^{(1)} \\ x_2^{(1)}},\ \bm{x}^{(2)} = \mat{x_1^{(2)} \\ x_2^{(2)}}, \cdots, \bm{x}^{(n)} = \mat{x_1^{(n)} \\ x_2^{(n)}}.
\end{align}

すると、$i$ 番目の2次元データを射影軸: $​\eq{eq:proj}$ に射影した際のデータは、

\begin{align}
\label{eq:proj2}
y^{(i)} = w_1 x_1^{(i)} + w_2 x_2^{(i)} = \bm{w}^\T \bm{x}^{(i)} \,\ \ \ \ (i=1, 2, \dots n)
\end{align}

と表記できます。ここで、$​​\bm{w}$ は係数ベクトル $(w_1, w_2)^\T$ で射影軸の方向を意味します。したがって主成分分析の目的は、分散が最大となる射影軸を求めること、言い換えれば、そのような係数ベクトル $\bm{w}$ ​を求めることとなります。

 そこで、射影軸上のデータの分散 $s_y^2$ を計算することにします。分散の定義 $s_y^2 \equiv \f{1}{n}\sum_i (y^{(i)} – \bar{y})^2$ より、まず射影軸上のデータの平均 $\bar{y}$ を計算すると、

\begin{align}\bar{y} &= \f{1}{n} \sum_{i=1}^n y^{(i)} \n&= \f{1}{n} \sum_{i=1}^n \( w_1 x_1^{(i)} + w_2 x_2^{(i)} \)\ \ \because (\eq{eq:proj2}を代入) \n&= w_1 \bar{x}_1 + w_2 \bar{x}_2 \ \ \because \textstyle (\bar{x} \equiv \f{1}{n} \sum_i x^{(i)})\label{eq:mean}\end{align}

となるので、分散 $s_y^2$ は、

\begin{align}s_y^2 &= \f{1}{n} \sum_{i=1}^n \(y^{(i)} – \bar{y} \)^2 \n&= \f{1}{n} \sum_{i=1}^n\{ w_1 \(x_1^{(i)} – \bar{x}_1\) + w_2 \(x_2^{(i)} – \bar{x}_2\) \}^2 \ \ \because (\eq{eq:proj2},\eq{eq:mean} を代入) \n&= w_1^2\underbrace{\f{1}{n} \sum_{i=1}^n \( x_1^{(i)} – \bar{x}_1 \)^2}_{=s_{11}} + 2w_1w_2 \underbrace{\f{1}{n}\sum_{i=1}^n \( x_1^{(i)} – \bar{x}_1 \)\( x_2^{(i)} – \bar{x}_2 \)}_{=s_{12}} + w_2^2 \underbrace{\f{1}{n} \sum_{i=1}^n \( x_2^{(i)} – \bar{x}_2 \)^2}_{=s_{22}} \n&= w_1^2 s_{11} + 2w_1w_2 s_{12} + w_2^2 s_{22} \n&= \bm{w}^\T S \bm{w}\label{eq:var}
\end{align}

と表記できます。ここで、行列 $S$ は2次元観測データに基づく分散共分散行列です。

\begin{align*}
S = \mat{s_{11} & s_{12} \\ s_{21} & s_{22}},\ \ s_{jk} \equiv \f{1}{n}\sum_{i=1}^n \(x_j^{(i)} – \bar{x}_j\)\(x_k^{(i)} – \bar{x}_k\),\ \ j,k=1,2.
\end{align*}

 したがって、主成分を知るためには $s_y^2= \bm{w}^\T S \bm{w}$ が最大となる $\bm{w}$ を求めれば良いわけですが、そのような $\bm{w}$ は $\|\bm{w}\| \to \infty$ となり発散してしまいます。

今興味があるのは係数ベクトル $\bm{w}$ の大きさではなく、その成分の比(すなわち、射影軸の方向)です。そこで、係数ベクトルに $\bm{w}^\T \bm{w} = 1$ という制約を課してやります。すると、主成分を求める問題は下記の最適化問題へ変化します。

\begin{align*}
\max_{\bm{w}} \bm{w}^\T S \bm{w}\ \ {\rm subject\ to}\ \ \bm{w}^\T\bm{w}=1.
\end{align*}

このような制約条件下での最大化問題は、ラグランジュの未定乗数法によって解くことができます。

等式条件下におけるラグランジュの未定乗数法の解説
この記事では、数理最適化問題を解く際の強力な手法である「ラグランジュの未定乗数法」について解説します。

つまり、ラグランジュ乗数を $\lambda$ として、ラグランジュ関数

\begin{align}
L(\bm{w}, \lambda) = \bm{w}^\T S \bm{w} + \lambda(1 – \bm{w}^\T \bm{w})\label{eq:lag}
\end{align}

の停留点(微分した関数が0となる点)を求めることによって解が得られます。

 ラグランジュ関数: $\eq{eq:lag}$ を $\bm{w}$ で偏微分すると次式となります。

\begin{align}
\pd{L}{\bm{w}} &= \pd{}{\bm{w}}(\bm{w}^\T S\bm{w}) + \lambda \pd{}{\bm{w}}(1-\bm{w}^\T \bm{w}) \n&= \pd{}{\bm{w}}(\bm{w}^\T S \bm{w}) – \lambda \pd{}{\bm{w}}(\bm{w}^\T \bm{w}) \n\n&= 2S\bm{w} -2\lambda \bm{w}.\label{eq:divlag}
\end{align}

ここで、ベクトル微分公式 $\partial(\bm{w}^\T S\bm{w}) / \partial \bm{w} = 2S \bm{w},\ \partial(\bm{w}^\T \bm{w}) / \partial \bm{w} = 2 \bm{w}$ を用いました。

「ベクトルで微分」公式導出
機械学習の理論を勉強すると「スカラーをベクトルで微分」する操作をよく目にします。この記事では「スカラーをベクトルで微分」の公式を導出します。

あとは、$\eq{eq:divlag}$ を $\bm{0}$ とおくことで、次式が求まります。

\begin{align*}
S\bm{w} = \lambda\bm{w}.
\end{align*}

このように主成分分析は、分散共分散行列の固有値問題に帰着することができます。

主成分の決定

 「データを射影した際に分散が最大となる射影軸を求める」という問題は、下記の固有値問題へ置き換わりました。

\begin{align*}
S\bm{w} = \lambda\bm{w}.
\end{align*}

では、固有値 $\lambda$ はどういった意味合いを持つのでしょうか。上式の左から $\bm{w}^\T$ を作用させます。すると、

\begin{align}
\bm{w}^\T S \bm{w} &= \bm{w}^\T \lambda \bm{w} \n&= \lambda \bm{w}^\T \bm{w} \n&= \lambda\ \ \textstyle \because (\bm{w}^\T \bm{w}=1)\label{eq:lambda}
\end{align}

となります。ここで、固有ベクトルは正規化されていること($\bm{w}^\T \bm{w}=1$)を用いました。すると $\eq{eq:lambda}$ 左辺は、$ \eq{eq:var} $ より射影軸上のデータの分散 $s_y^2 = \bm{w}^\T S \bm{w}$ であることがわかります。したがって、固有値 $\lambda$ は射影軸上のデータの分散そのものを意味することになります。

\begin{align*}
{\rm Var}[y] = \lambda
\end{align*}

 以上より、固有値問題 $S\bm{w} = \lambda\bm{w}$ に対して、最大固有値 $\lambda_1$ に属する固有ベクトル $\bm{w}_1$ が第1主成分の方向を与えることがわかります。

また、分散共分散行列 $S$ はその定義から対称行列です。対称行列について、異なる固有値に属する固有ベクトル同士は直交する性質があります。

したがって、固有値問題 $S\bm{w} = \lambda\bm{w}$ に対して、2番目に大きな固有値 $\lambda_2$ に属する固有ベクトル $\bm{w}_2$ が第2主成分の方向を与えることもわかります。

多次元への射影

 以上では1次元への射影の場合を見てきましたが、一般に多次元部分空間に圧縮する場合を考えましょう。
観測された $n$ 個の $p$ 次元データを行列を用いて下記のように表すことにします。

\begin{align*}
\us X_{[n \times p]}=\mat{x_1^{(1)} & x_2^{(1)} & \cdots & x_q^{(1)} &\cdots & x_p^{(1)} \\ x_1^{(2)} & x_2^{(2)} & \cdots & x_q^{(2)} &\cdots & x_p^{(2)} \\ \vdots & \vdots & \ddots & \vdots & \ddots & \vdots \\ x_1^{(n)} & x_2^{(n)} & \cdots & x_q^{(n)} &\cdots & x_p^{(n)}\\}=\mat{- & \bm{x}^{(1)\T} & – \\ – & \bm{x}^{(2)\T} & – \\ & \vdots & \\ – & \bm{x}^{(n)\T} & – \\}
\end{align*}

上記の $p$ 次元データを $q$ 次元データ $(q < p)$ へ、主成分分析を用いて次元削減することを考えます。

これまでの議論から次元削減後の $q$ 次元空間は、第1主成分から第 $q$ 主成分が張る空間であることがわかります。そこで主成分を求めるために、観測された $n$ 個の $p$ 次元データに基づく分散共分散行列を $\us S_{[p \times p]}$ として、その固有値と固有ベクトルの組を降順に $q$ 個並べます。

\begin{align*}
&\lambda_1 &\geq \t\ \ &\lambda_2 &\geq \t\ \ &\cdots &\geq \t\ \ &\lambda_q \\&\bm{w}_1 &\ \t\ \ &\bm{w}_2 & \t\ \ & & \t\ \ &\bm{w}_q
\end{align*}

ここで、$\bm{w}_j = (w_{j1}, w_{j2}, \dots, w_{jp})^\T$ です。すると、第1主成分 $y_1$ から第 $q$ 主成分 $y_q$ は下記のように表すことができます。

\begin{align*}
第1主成分 \t y_1 &= w_{11}x_1 + w_{12}x_2 + \cdots + w_{1p}x_p = \bm{w}^\T _1 \bm{x} \\第2主成分 \t y_2 &= w_{21}x_1 + w_{22}x_2 + \cdots + w_{2p}x_p = \bm{w}^\T _2 \bm{x} \\&\ \ \vdots \\第q主成分 \t y_q &= w_{q1}x_1 + w_{q2}x_2 + \cdots + w_{qp}x_p = \bm{w}^\T _q \bm{x}
\end{align*}

 主成分分析を適応すると、観測された $i$ 番目の $p$ 次元データ $\bm{x}^{(i)} = \( x_1^{(i)}, x_2^{(i)}, \dots, x_p^{(i)} \)^\T$ は、それよりも次元の低い $q$ 次元空間 $(q < p)$ へ射影され、$q$ 次元データ $\bm{y}^{(i)} = \( y_1^{(i)}, y_2^{(i)}, \dots, y_q^{(i)} \)^\T$ となります。各成分は、次の通りです。

\begin{align*}
y_j^{(i)} = w_{j1}x_1^{(i)} + w_{j2}x_2^{(i)} + \cdots + w_{jp}x_p^{(i)} &= \bm{w}_j^\T \bm{x}^{(i)} \\&=\bm{x}^{(i)\T} \bm{w}_j\\(i = 1, \dots, n), \ \ (j=1, \dots,q)
\end{align*}

この射影は、行列を用いてまとめて記述すると次式となります。

\begin{align*}
\underbrace{\mat{y_1^{(1)} & y_2^{(1)} & \cdots & y_q^{(1)} \\ y_1^{(2)} & y_2^{(2)} & \cdots & y_q^{(2)} \\ \vdots & \vdots & \ddots & \vdots \\ y_1^{(n)} & y_2^{(n)} & \cdots & y_q^{(n)} \\}}_{\equiv \us Y_{[n \times q]}}=\underbrace{\mat{- & \bm{x}^{(1)\T} & – \\ – & \bm{x}^{(2)\T} & – \\ & \vdots & \\ – & \bm{x}^{(n)\T} & – \\}}_{\equiv \us X_{[n \times p]}}\underbrace{\mat{ | & | & & | \\ \bm{w}_1 & \bm{w}_2 & \cdots & \bm{w}_q \\ | & | & & |}}_{\equiv \us W_{[p \times q]}}
\end{align*}

\begin{align}
\large\therefore \us Y_{[n \times q]} = \us X_{[n \times p]} \us W_{[p \times q]}
\end{align}

このように主成分分析による射影は、固有ベクトルを列方向に並べた射影行列 $W$ を構成し、それを観測データ行列 $X$ の右から作用させることにより成されます。

主成分分析の実装編はこちら▼

主成分分析(PCA)の解説 pythonによる実装と例題
主成分分析(PCA)をフルスクラッチとscikit-learnを用いて実装します。ここでは、Pythonを用いた実装をおこないます。
タイトルとURLをコピーしました