機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

フィッシャーの線形判別(2)

フィッシャーの線形判別(1)の続きです。

先回の記事のまとめ

2クラスのデータをより分離しやすいように次元圧縮することを考えています。フィッシャーの判別基準は、


\displaystyle  J(\mathbf w) = \frac{(m_2 - m_1)^2}{s_1^2 + s_2^2} \tag{1}

と定義され、これを最大にする\mathbf wが解(次元圧縮方向)でした。

解を計算する

ここで、m_2 - m_1 はスカラですから、内積の順番を入れ替えても同じですので


m_2 - m_1 = \mathbf w^{T}(\mathbf{m}_2 - \mathbf{m}_1) = (\mathbf{m}_2 - \mathbf{m}_1)^{T}\mathbf w \tag{2}

です。よって、


(m_2 - m_1)^2 = \mathbf w^{T}(\mathbf{m}_2 - \mathbf{m}_1)(\mathbf{m}_2 - \mathbf{m}_1)^{T}\mathbf w \tag{3}

と書けます。式(3)において、


\mathbf{S}_B = (\mathbf{m}_2 - \mathbf{m}_1)(\mathbf{m}_2 - \mathbf{m}_1)^{T} \tag{4}

とし、\mathbf{S}_Bをクラス間共分散行列と定義します。

y = \mathbf{w}^{T} \mathbf{x} m_k=\mathbf{w}^{T} \mathbf{m}_kですから、これとフィッシャーの線形判別(1)の(5)より、


\begin{eqnarray*}
\displaystyle s_1^2 + s_2^2 &=&  \sum_{n\in C_1} \mathbf w^T(\mathbf x_n - \mathbf m_1)(\mathbf x_n - \mathbf m_1)^T \mathbf w  
+ \sum_{n\in C_2} \mathbf w^T(\mathbf x_n - \mathbf m_2)(\mathbf x_n - \mathbf m_2)^T \mathbf w \tag{5} \\
&=& \mathbf w^T \left\{ \sum_{n\in C_1}  (\mathbf x_n - \mathbf m_1)(\mathbf x_n - \mathbf m_1)^T  + \sum_{n\in C_2} (\mathbf x_n - \mathbf m_2)(\mathbf x_n - \mathbf m_2)^T  \right\} \mathbf w \tag{6}
\end{eqnarray*}

です。ここで


\displaystyle \mathbf{S}_W = \sum_{n\in C_1}  (\mathbf x_n - \mathbf m_1)(\mathbf x_n - \mathbf m_1)^T  + \sum_{n\in C_2} (\mathbf x_n - \mathbf m_2)(\mathbf x_n - \mathbf m_2)^T \tag{7}

とし、\mathbf{S}_Wをクラス内共分散行列と定義します。 式(4)、(7)を使えば、式(1)は


\displaystyle  J(\mathbf w) = \frac{\mathbf w^T \mathbf{S}_B \mathbf w}{\mathbf w^T \mathbf{S}_W \mathbf w} \tag{8}

と書けます。さて、これを最大にする\mathbf wを求めることが目的でしたから、式(8)を微分して0になる解を求めます。分数の微分公式を使い、


\displaystyle \frac{\partial  J(\mathbf w)}{\partial \mathbf w} = \frac{ (\mathbf w^T \mathbf{S}_B \mathbf w)^{\prime} \mathbf w^T \mathbf{S}_W \mathbf w - \mathbf w^T \mathbf{S}_B \mathbf w(\mathbf w^T \mathbf{S}_W \mathbf w)^{\prime}}{(\mathbf w^T \mathbf{S}_W \mathbf w)^2} = 0\tag{9}

を解きます。ここでベクトルの微分の式(8)を使い、また、\mathbf{S}_B\mathbf{S}_Wは共分散行列で対称行列となっていることに注意すれば、


2\mathbf{S}_B \mathbf w \mathbf w^T \mathbf{S}_W \mathbf w - 2 \mathbf w^T \mathbf{S}_B \mathbf w \mathbf{S}_W \mathbf w = 0\tag{10}

となります。式(10)において\mathbf{w}^T \mathbf{S}_W \mathbf{w}\mathbf{w}^T \mathbf{S}_B \mathbf{w}はスカラですから、順番を入れ替えても同じになります。よって、


(\mathbf w^T \mathbf{S}_W \mathbf w)\mathbf{S}_B \mathbf w  =  (\mathbf w^T \mathbf{S}_B \mathbf w) \mathbf{S}_W \mathbf w \tag{11}

となります。いま、知りたいのは射影する方向であることに注目すれば、以下のように簡単にすることができます。

まず、


\mathbf S_B \mathbf w = (\mathbf{m}_2 - \mathbf{m}_1)(\mathbf{m}_2 - \mathbf{m}_1)^T\mathbf w \tag{12}

において、 (\mathbf{m}_2 - \mathbf{m}_1)^{T} \mathbf{w}はスカラですので、


\mathbf S_B \mathbf w \propto \mathbf{m}_2 - \mathbf{m}_1 \tag{13}

となります。よって、式(11)のスカラ量を除けば、


\begin{eqnarray*}
\mathbf S_W \mathbf w &\propto& \mathbf{m}_2 - \mathbf{m}_1 \tag{14} \\
\mathbf w &\propto& \mathbf S_W^{-1}(\mathbf{m}_2 - \mathbf{m}_1 ) \tag{15}
\end{eqnarray*}

となり、式(15)によって射影の方向を求めることができます。次回、この式を使って実際にデータを射影してみたいと思います。次回:フィッシャーの線形判別(3)