Follow @data_no_memo

メモ

個人的なメモです。他者にわかりやすく書くよりも未来の自分にわかりやすく書いています。なお、記事内容の正確さは保証できません。勉強中の身ですので、間違い等ご指摘頂けたら幸いです。

機械学習・Pythonお勉強(線形識別関数を例にして 理論編)

はじめに

 以下の記事の続き。

abcxyzonetwothree.hatenablog.com

abcxyzonetwothree.hatenablog.com

 

 今回は線形識別関数について。特にここでは、線形判別分析を取り上げる。『はじめてのパターン認識』では線形判別分析以外にも線形識別関数とロジスティック回帰分析が取り上げられている。ただし、前者は単なる回帰分析に過ぎないし、後者はその名の通りお馴染みのロジスティック回帰分析である。以上から、これらはスキップする。なお、ロジスティック回帰分析については以下の記事を書いている。

abcxyzonetwothree.hatenablog.com

線形判別分析について

 通常の回帰分析では最小二乗法を用いてパラメータを求める。ここでは、できるだけ手元のデータと求めるパタメータによって形成される回帰式との間に齟齬がないようにパラメータが推定される。すなわち、データと回帰式との間の誤差を最小にするようにパラメータが求められる。一方で線形判別分析ではデータを1次元に写像した時にクラスの分布が出来るだけ重ならないようにすることを考える。

 

フィッシャーの線形判別関数

 まずフィッシャーの線形判別関数について。結論から言うと分散分析の時のように、クラス間変動とクラス内変動を考え、クラス内変動の合計に対するクラス間変動の割合を最大にすることを考える。

 ここでまず、線形識別関数 y = w^T xという線形変換を考える。クラスkのyの平均値は m_k = w^T \mu_kである。ここでは k = 2の時を考える。すなわち、クラスが2つあるとする。この時、クラス1の平均値とクラス2の平均値の差は以下のように表現できる。

 m_1 - m_2 = w^T(\mu_1 - \mu_2)

 この m_1 - m_2が大きい時、すなわち各クラスの平均値が互いに離れている時、最もクラスの重なりが小さくなると言える*1。なお、これを正負を相殺するために二乗した値はクラス間変動と呼ばれる。

 さらに、クラスごとのデータの分布の広がりが小さい方が互いに重なりにくいことが想像される。なお、このクラス内の広がりは分散に類似したかたちで以下のように表現できる。ここではクラス1を想定している

 S^2_1 = \sum(y_i - m_1)^2

 これをクラス内変動と呼ぶ。なお、クラス数分だけ上記のクラス内変動を求め、その合計値は全クラス内変動と呼ばれる。クラス数が二つの時は S_1^2 + S_2^2となる。ここで、全クラス内変動に対するクラス間変動を考える。それは以下の通りである。

 J(w) = \frac{(m_1 - m_2)^2}{S_1^2 + S_2^2}

 これを最大化するbを求めてあげる。これを考えると何が良いかと言うと、クラス間変動を最大化しつつ、クラス内変動を最小化するということを同時に行える。このようにパラメータを求めることをフィッシャーの基準という。

 ここで、クラス間変動は以下のように変形できる。

 (m_1 - m_2)^2 = w^T(\mu_1 - \mu_2)^2 = (w^T(\mu_1 - \mu_2))(w^T(\mu_1 - \mu2))^T = w^T (\mu_1 - \mu_2)(\mu_1 - \mu_2)^T w = w^T S_B w 

 最後の S_Bはクラス間変動行列と呼ばれる。

 一方クラス内変動も以下のように変形できる。ここでは一般にクラスkを考えている。

 S_k^2 = \sum(y_i - m_k)^2 = \sum(w ^ T (x_i - \mu_k))^2 = \sum(w ^ T (x_i - \mu_k))(w^T(x_i - \mu_k))^T = w^T(\sum(x_i - \mu_k)(x_i - \mu_k)T)w = w^T S_k w

 よって、全クラス内変動は以下のように表現できる。

 S_1^2 + S_2 ^2 = w^T(S_1 + S_2)w = w^T S_k w

 以上から、フィッシャーの基準は以下の通りである。

 J(w) = \frac{w^T S_B w}{w^T S_w w}

 この式を最大化するパラメータ wを求める。

 

判別分析法

 これは大津の二値化とも呼ばれるらしい。フィッシャーの線形判別関数と非常に類似している。フィッシャーはパラメータ wを持つ以下の関数を最大化することを考えた。

 J(w) = \frac{(m_1 - m_2)^2}{S_1^2 + S_2^2}

 一方で判別分析法では以下の関数を最大化することを考える。

 J(w) = \frac{P(C_1)(m_1 - \bar{m})^2 + P(C_2)(m_2 - \bar{m})^2}{P(C_1) \sigma^2_1 + P(C_2) \sigma^2_2}

 ここで、 \bar{m}は全データの平均であり、 P(C_1) P(C_2)はそれぞれクラスの事前確率である。すなわち、全体のデータ数に対してそれぞれのクラスに属するデータの数がその確率となる。

 実はこのあたりよく分からなかったが、イメージとしてはそれぞれのクラスの確率で重み付けしてあげている感じだと考えられる。

*1:ただこれ、単峰分布を仮定しないとだめ?