Goodな生活

Goodな生活

データサイエンスと弦楽器を探究する

判別分析(1)線形判別関数

線形判別分析

判別分析の目的は量的なデータを元に質的な結果を予想すること。例えば身長や体重、血圧といった量的なデータを元に、その人が健康か不健康かを判断する。線形判別とはデータを直線で分け、データが直線の左右どちらにあるかを判別する。図1は2次元データ(x_i,y_i)の散布図であり、青グループと赤グループは質的に異なると仮定する。青を1群、赤を2群とし、直線を引いてこれらを区別する。

f:id:good_na_life:20210609062423p:plain
図1 石井(2014)を元に作成

まずデータの平均(\bar{x},\bar{y})(図2の黒点)を通る直線を引き、さらにその直線に直交する直線(l)を引く。直線lは青(1群)と赤(2群)の判別のために用いる。

f:id:good_na_life:20210609062832p:plain
図2 石井(2014)を元に作成

直線lに、各データ(x_i,y_i)から垂線を下ろす。l上で垂線の足が青と赤でよく分かれていれば精度のよい判別ができる、と考える。lの方向ベクトルを(a,b)とする。

f:id:good_na_life:20210609063314p:plain
図3 石井(2014)を元に作成

各データ(x_i,y_i)からlに下ろした垂線の足とデータの平均(\bar{x},\bar{y})との距離をz_iとする。z_iは正負付きの距離であり、平均より右側が正(+)、左側が負(-)。

f:id:good_na_life:20210609063751p:plain
図4 石井(2014)を元に作成

ここでlの方向ベクトル(a,b)u、平均から各データに向かう方向ベクトルをvとすると、z_iuv内積によって計算できる。

f:id:good_na_life:20210609063934p:plain
図5 石井(2014)を元に作成

 {\begin{eqnarray}
z_i &=& ||v|| \cos θ  \\
     &=& \frac{||u|| ||v|| \cosθ}{||u||} \\
     &=& \frac{u・v}{||u||} \\
     &=& \frac{a(x_i - \bar{x})+ b(y_i - \bar{y})}{\sqrt{a^2 + b^2}} \tag{1}
\end{eqnarray}}

青(1群)のデータ数をm個、赤(2群)のデータ数をn個とする。よって2次元データ(x_i,y_i)の総数はm+n個。ここでz_iについて3種類の変動を定義できる。

  • 全変動(total)

S_T = \sum_{i=1}^{m+n}(z_i-\bar{z})^2 \tag{2}

  • 郡内変動(within class)

S_W = \sum_{k=1}^{2}\sum_{i=1}^{m+n}(z_i-\bar{z_k})^2 \tag{3}

  • 群間変動(between class)

{\begin{eqnarray} S_B &=& \sum_{k=1}^{2} N_k(\bar{z_k} - \bar{z}) \\
 &=&  m(\bar{z_1}-\bar{z})^2 + n(\bar{z_2}-\bar{z})^2 \tag{4} \end{eqnarray}}

全変動は郡内変動と群間変動の和で表される。

 {\begin{eqnarray}
S_T = S_W + S_B \tag{5}
\end{eqnarray}}

図4を使って変動をイメージする。全変動はすべてのz_iと全平均(黒点)との偏差の平方和。郡内変動はすべてのz_iと、青(1群)と赤(2群)それぞれの平均との偏差の平方和。群間変動は全平均(黒点)と各郡の平均との偏差の平方和。

最大化問題の立式

線形判別の目的は直線によってなるべく明確にデータをグループ分けすること。明確ではない分け方とは青(1群)と赤(2群)に重複があるような場合。つまり青(1群)と赤(2群)がよくばらつくような直線を引けばよい。また青(1群)と赤(2群)はそれぞれ同質なデータを集約したものであるため、よくまとまっているようなグループ分けが理想である。すなわち群間変動(S_B)を最大にし、郡内変動(S_W)を最小にするような直線lを引けばよい。目的関数を \frac{S_B}{S_W}とし、これを最大にするような直線lの方向ベクトル(a,b)を選ぶ。

 {\begin{eqnarray}
\max_{a,b} \frac{S_B}{S_W}  \tag{6}
\end{eqnarray}}

判別方法

(6)の最大化問題の解を\mathbf{a^*} = (a^{*},b^{*})とする。直線lに直交する直線mの式は、全データの平均(\bar{x},\bar{y})を通り、ベクトル\mathbf{a^*} = (a^{*},b^{*})に直交する直線の式であるため、

 {\begin{eqnarray}
a^{*}(x-\bar{x}) + b^{*}(y - \bar{y}) =0  \tag{7}
\end{eqnarray}}

と表すことができる。

f:id:good_na_life:20210609162841p:plain
図6 石井(2014)を元に作成

ここで新しいデータ(x_0, y_0)が得られたと仮定し、青(1群)と赤(2群)のどちらに属するかを判別する。まず(x_0, y_0)の垂線の足と元のデータの中心との距離(判別得点)z_0(x_0,y_0)を計算する。

 {\begin{eqnarray}
z_0(x_0,y_0) = \frac{a^{*}(x_0-\bar{x}) + b^{*}(y_0 - \bar{y})}{\sqrt{(a^{*})^2 + (b^{*})}} \tag{8}
\end{eqnarray}}

判別得点z_0(x_0,y_0)の符号(正負)で青(1群)と赤(2群)のどちらかに属するかを判別する。

 {\begin{eqnarray}
sign [{a^{*}(x_0-\bar{x}) + b^{*}(y_0 - \bar{y})}] \tag{9}
\end{eqnarray}}

線形判別関数

(6)の最大化問題を満たす方向ベクトルを\mathbb{a}は次のように与えられる。\bar{x_1},\bar{x_2}は青(1群)と赤(2群)のデータだけで計算した平均のベクトル。

 {\begin{eqnarray}
\mathbf{a} = S^{-1}(\mathbf{\bar{x_1}}-\mathbf{\bar{x_2}}) \tag{10}
\end{eqnarray}}

すると判別関数は以下のように書き換えられる。

 {\begin{eqnarray}
a^{*}(x_0 - \bar{x} + b^{*}(y_0 - \bar{y})) 
&=& a^* x_0 + b^* y_0 - (a^* \bar{x} + b^* \bar{y}) \\
&=& \mathbf{a} \mathbf{x_0} - \mathbf{a} \mathbf{\bar{x}}  \\
&=& (\mathbf{\bar{x_1}-\bar{x_2}})^\top S^{-1} \mathbf{x_0}- (\mathbf{\bar{x_1}-\bar{x_2}})^\top S^{-1} \mathbf{\bar{x}} \tag{11}
\end{eqnarray}}

\bar{x_1},\bar{x_2}の中点を\mathbf{x}だと考えると、

 {\begin{eqnarray}
(\mathbf{\bar{x_1}-\bar{x_2}})^\top S^{-1} \mathbf{x_0}- \frac{1}{2} (\mathbf{\bar{x_1}-\bar{x_2}})^\top S^{-1} (\mathbf{\bar{x_1}+\bar{x_2}}) \tag{12}
\end{eqnarray}}

と書くこともできる。(12)のように青(1群)と赤(2群)の平均のベクトルを使い、データxの判別関数を表すこともできる。

 {\begin{eqnarray}
h(\mathbf{x}) = (\mathbf{\bar{x_1}-\bar{x_2}})^\top S^{-1} \mathbf{x}- \frac{1}{2} (\mathbf{\bar{x_1}-\bar{x_2}})^\top S^{-1} (\mathbf{\bar{x_1}+\bar{x_2}}) \tag{13}
\end{eqnarray}}

これをフィッシャーの線形判別関数と呼ぶ。