データ `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` |
---|---|---|---|---|
1 | 9 | 1 | 4 | 7 |
2 | 10 | 1 | 5 | 7 |
3 | 5 | 4 | 3 | 10 |
4 | 4 | 2 | 4 | 8 |
答:大学を表すデータを群 1、プロバイダーを表すデータを群 2、
`x_1,x_2` へのアクセス数を`(x_1, x_2)` とする。ホストを推定する線形判別関数 `F` は、
`(x_1,x_2)` とベクトル `(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 の計算を見直しているので、「計算」「コピー」ボタンは表示していない。
今回は、プールされた分散共分散行列を使うため、QR 分解を使う方法は適用できなかった。 (あるのかもしれないが、私にはわからない)。 通常はプールされた分散共分散行列に対して逆行列を求めるのだが、数値計算を習った先生からは、 「逆行列は死んでも使うな」と言われた。そこで、分散共分散行列が正定値対称行列であることを利用して、 コレスキー分解 (Cholesky Decomposition) を使う方法を適用した。
コレスキー分解について説明する。 これは、正方行列の LU 分解を正定値対称行列に適用した特別な場合ということができる。
`n` 次正方行列 `P` は正定値対称行列とする。このとき、`P` の逆行列が存在するならば、 `P = S {::}^tS` となる `n` 次下三角行列 `S` が唯一つ存在する(`{::}^tS` は `S` の転置行列)。 この `S` を求める。 求め方は、LU 分解とほとんど同じである。 頑強な計算のためには、対角成分が 0 にならないよう、ピボット選択をする必要がある。 今回は行なっていない。