判別分析 |
作成日:2004-08-17 最終更新日: |
データ(x1, x2, ..., xp)が2つの群のいずれに属するかがわかっているとき、 未知のデータがどちらに属するかを判定するにはどうすればよいか。 このための方法が、判別分析である。
例題:2つのWebページx1,x2がある。アクセス元のホストが、大学かプロバイダーかで、 次のようなアクセス数の違いがある。アクセス元のホストが不明な場合、 アクセス数の違いからアクセス元のホストを推定するにはどうすればよいか。
| No. | 大学x1 | 大学x2 | プロバイダーx1 | プロバイダーx2 |
|---|---|---|---|---|
| 1 | 9 | 1 | 4 | 7 |
| 2 | 10 | 1 | 5 | 7 |
| 3 | 5 | 4 | 3 | 10 |
| 4 | 4 | 2 | 4 | 8 |
答:大学を表すデータを群1、プロバイダーを表すデータを群2、
x1,x2へのアクセス数を(x1, x2)とする。ホストを推定する線形判別関数は、
(x1,x2)とベクトル(a1, a2)の線形結合として定義される。定数a0を導入して、式
a0 + a1 * x1 + a2 * x2
が正のとき1群に、負のとき2群に判別されるように、ベクトルa = (a1, a2)および定数a0を決める。
| 群1 | 群2 | |
|---|---|---|
| 標本数 | n1 | n2 |
| 標本平均ベクトル | `tilde x_1` | `tilde x_2` |
| 分散共分散行列 | S1 | S2 |
プールされた分散共分散行列Sは次で定義される。
S = (n1S1 + n2S2) / (n1 + n2)
この S を用いて、ベクトルaは次の式で表せる。
`a = S^(-1)(tilde x_1 - tilde x_2)`
a0は次の式で求められる。
`a_0 = -a * (tilde x_1 + tilde x_2) / 2`
ただし、上付きの-1は逆行列を表す。
以下は、JavaScript で計算を行なう場合のフォームである。 「コピー」のボタンを押すと上記の数値例が入力されるので、「計算」のボタンを押すと、 定数 a0と係数a1, a2が返る。 未知データに判別したいデータを入れると、「計算」のボタンを押したときに、 右側に判別式を計算した値が同時に表示される。正であれば1群に、負であれば2群に分類すればよい。
今回は、プールされた分散共分散行列を使うため、QR分解を使う方法は適用できなかった。 (あるのかもしれないが、私にはわからない)。 通常はプールされた分散共分散行列に対して逆行列を求めるのだが、数値計算を習った先生からは、 「逆行列は死んでも使うな」と言われた。そこで、分散共分散行列が正定値対称行列であることを利用して、 コレスキー分解(Cholesky Decomposition)を使う方法を適用した。
コレスキー分解について説明する。 これは、正方行列のLU分解を正定値対称行列に適用した特別な場合ということができる。
P を n * n の正定値対称行列とする。このとき、Pの逆行列が存在するならば、 P = SSt となるn*nの下三角行列Sが唯一つ存在する(StはSの転値行列)。このSを求める。 求め方は、LU分解とほとんど同じである。 実際に計算をするためには、対角成分が0にならないよう、ピボット選択をする必要がある。 今回は行なっていない。
文献