overflow33の日記

python 機械学習 系の記事を書いて行きたい所存

線形判別(LDA: Linear Discriminant Analysis) とは

線形判別(LDA: Linear Discriminant Analysis) とは

特徴量空間で、各クラスをガウス分布へ当てはめ、当てはめた分布を直線で分けるとき、どの方向に直線を引くのが良いか求めるものである。

フィッシャーの線形判別と検索すれば解説が出てくる。
例えば、以下。
フィッシャーの線形判別分析法 - Qiita

この説明では、引数(priors: 事前確率)の意味が理解できないため、以下では、sci-kit learn の解説ページをベースに説明する。**

sci-kit learn 公式の解説

1.2. Linear and Quadratic Discriminant Analysis — scikit-learn 0.22.2 documentation

ナイーブベイズ推定において、分布をガウス分布で近似し、境界を特徴量の線形結合の形(線形)に限定したものと解釈する。

問題設定

ある特徴量ベクトルXが与えられたとき、Xがクラスkに属する事後確率は、ベイズの定理から、次のように求められる。
P(y=k | X) = \frac{P(X | y=k) P(y=k)}{P(X)} = \frac{P(X | y=k) P(y = k)}{ \sum_{l} P(X | y=l) \cdot P(y=l)}
ここで、X: 特徴量ベクトル, y: Xの属するクラス, k: クラス である。

ここで、P(y= k | X)が最大になるようなkを求めれば良い。
(ここまでは、ナイーブベイズ推定と同じ)

各クラスの分布をガウス分布と仮定

各クラスの分布P(X | y)ガウス分布であると仮定する。
P(X | y=k) = \frac{1}{(2\pi)^{d/2} |\Sigma_k|^{1/2}}\exp\left(-\frac{1}{2} (X-\mu_k)^t \Sigma_k^{-1} (X-\mu_k)\right)
ここで、\mu_k: クラスkの平均ベクトル,  \Sigma_k: クラスkの共分散行列

各クラスの共分散行列が一致すると仮定

線形判別では、さらに、すべてのクラスにおいて、クラス内共分散行列(分散共分散行列)が一致する(\Sigma_k = \Sigma)と仮定すると、特徴量空間で線形の判別となる。

クラスの境界が線形となることの証明

線形となることは、2つのクラスk,lに対して、確率が同じになる境界が、特徴量の線形結合で表せることを示せばよい。

2つのクラスk,lに対して、確率が同じになるのは、次の場合である。
\frac{P(y=k | X)}{P(y=l | X)}=1

両辺に対数を取って、ベイズの定理、各クラスの分布P(X | y)ガウス分布であること、各クラスの共分散行列が同じであることを用いると、以下の式が得られる。
\log\left(\frac{P(y=k|X)}{P(y=l|X)}\right)=\log\left(\frac{P(X|y=k)P(y=k)}{P(X|y=l)P(y=l)}\right)=0 \Leftrightarrow
(\mu_k-\mu_l)^t\Sigma^{-1} X =\frac{1}{2} (\mu_k^t \Sigma^{-1} \mu_k - \mu_l^t \Sigma^{-1} \mu_l)- \log\frac{P(y=k)}{P(y=l)}

右辺(\frac{1}{2} (\mu_k^t \Sigma^{-1} \mu_k - \mu_l^t \Sigma^{-1} \mu_l)- \log\frac{P(y=k)}{P(y=l)})、および、Xの係数(\mu_k-\mu_l)^t\Sigma^{-1}は、定数であり、クラスk,lの境界は特徴量空間で線形である。
*P(y=k), P(y=l)は、各クラスがどの程度発生するかを表す事前確率である。

計算するもの

以上から線形判別では、各クラスに共通で当てはめができる共分散行列\Sigmaを求めれば良い。

ソルバー ’lsqr’ では、各クラスの共分散行列と平均の積\Sigma_l \mu_lと、共通の共分散行列と平均の積\Sigma \mu_lとの二乗誤差の総和が最も小さくなるものを利用する。

ソルバー 'eigen' では、基本的にクラス内分散をクラス間分散の比が大きくなるものを計算している。
これは、フィッシャーの線形判別として解説されているものである。

参考:
http://www.svcl.ucsd.edu/courses/ece271B-F09/handouts/Dimensionality3.pdf

’svd’では、'eigen'での計算の効率化のため、固有値を計算せずに、特異値分解(SVD: Singular Value Decomposition)を利用して、直接解を求めている(ようである 未確認)。


**
なお、事前確率(priors)を入力しない場合、学習データに含まれるデータの割合がそのまま事前確率となる。
学習データとテストデータでデータに含まれるラベルの割合が大きく異なることが予想できる場合、テストデータに合わせて事前確率を入力するべきである。