判別分析

作成日 : 2004-08-17
最終更新日 :

データ `x_1, x_2, cdots , x_p` が2つの群のいずれに属するかがわかっているとき、 未知のデータがどちらに属するかを判定するにはどうすればよいか。 このための方法が、判別分析である。

例題 : 2つの WEB ページ `x_1,x_2` がある。日ごとのアクセス数をアクセス元のホストが大学かプロバイダーかに分けて記録したところ、 次のようなアクセス数の違いがあった(No.1 から 4 は別々の日であることを表す)。アクセス元のホストが不明な場合、 2つの WEB ページ `x_1,x_2` のアクセス数の違いだけから、 アクセス元のホストが大学のものかプロバイダーのものかを推定するにはどうすればよいか。

No.大学 `x_1`大学 `x_2`プロバイダー `x_1`プロバイダー `x_2`
19147
210157
354310
44248

答:大学を表すデータを群 1、プロバイダーを表すデータを群 2、 `x_1,x_2` へのアクセス数を`(x_1, x_2)` とする。ホストを推定する線形判別関数 `F` は、 `(x_1,x_2)` とベクトル `(a_1, a_2)` の線形結合として定義される。定数 `a_0` を導入して、式

`F(x_1, x_2) = a_0 + a_1 * x_1 + a_2 * x_2`
が正のとき群 1 に、負のとき群 2 に判別されるように、ベクトル `a = (a_1, a_2)` および定数 `a_0`を決める。

次のように記法を定義する。

群1群2
標本数`n_1``n_2`
標本平均ベクトル`tilde x_1``tilde x_2`
分散共分散行列`S_1``S_2`

プールされた分散共分散行列 `S` は次で定義される。

`S = (n_1S_1 + n_2S_2) / (n_1 + n_2)`

この S を用いて、ベクトルaは次の式で表せる。

`a = S^(-1)(tilde x_1 - tilde x_2)`

`a_0` は次の式で求められる。

`a_0 = -a * (tilde x_1 + tilde x_2) / 2`

ただし、`S^-1` は `S` の逆行列を表す。

以下は、JavaScript で計算を行なう場合のフォームである。 「コピー」のボタンを押すと上記の数値例が入力されるので、「計算」のボタンを押すと、 定数 a0と係数a1, a2が返る。 未知データに判別したいデータを入れると、「計算」のボタンを押したときに、 右側に線型判別関数を計算した値が同時に表示される。正であれば1群に、負であれば2群に分類すればよい。 現在 JavaScript の計算を見直しているので、「計算」「コピー」ボタンは表示していない。


定数: 係数:
既知群 1 データ既知群 2 データ未知データ線型判別関数計算値

付録

コレスキー分解

今回は、プールされた分散共分散行列を使うため、QR 分解を使う方法は適用できなかった。 (あるのかもしれないが、私にはわからない)。 通常はプールされた分散共分散行列に対して逆行列を求めるのだが、数値計算を習った先生からは、 「逆行列は死んでも使うな」と言われた。そこで、分散共分散行列が正定値対称行列であることを利用して、 コレスキー分解 (Cholesky Decomposition) を使う方法を適用した。

コレスキー分解について説明する。 これは、正方行列の LU 分解を正定値対称行列に適用した特別な場合ということができる。

`n` 次正方行列 `P` は正定値対称行列とする。このとき、`P` の逆行列が存在するならば、 `P = S {::}^tS` となる `n` 次下三角行列 `S` が唯一つ存在する(`{::}^tS` は `S` の転置行列)。 この `S` を求める。 求め方は、LU 分解とほとんど同じである。 頑強な計算のためには、対角成分が 0 にならないよう、ピボット選択をする必要がある。 今回は行なっていない。

文献

  1. 多変量解析ハンドブック 現代数学社p.128
  2. C 言語ディジタル信号処理 培風館

まりんきょ学問所統計活用術 ≫ 判別分析

MARUYAMA Satosi