コンテンツにスキップするには Enter キーを押してください

マハラノビス距離 を用いた機械学習を python で実装

 

マハラノビス距離 を用いたクラスタリング

マハラノビス距離( Mahalanobis ‘ Distance)とは主に統計で用いられる分散を考慮した距離の一種です。
詳しくはwikiで見てください。

今回はこのマハラノビス距離を用いた教師あり機械学習をpythonで実装します。

例として2次元の特徴を持つテストデータのクラスタリングを行っていますが、
実装としては(メモリが許す限り)N次元の特徴を持つ学習にも対応しています。
コードの全文はGithubにあげています。


この画像の黒*点はどこに属するでしょうか。
各クラスの平均値との距離を取るだけではこの*点は緑のほうが近そうです。
しかし、赤は広く分布しているので、おそらくは赤でしょう。
マハラノビス距離を使えば、このように分散が異なるクラスに対してユークリッド距離を用いた手法より正確にクラスタリングできます。

 

マハラノビス距離の定義

マハラノビス距離を測るための準備として、学習データの平均値、分散、共分散を求めます。
K次元のデータ群に対し、クラスがcである
$$N^{(c)}$$
個の学習用データを
$$X^{(c)}_n = (X_{n1}, X_{n2},…, X_{nk})^T, n=1, …, N^{(c)}$$
とすると、各クラス毎に計算される平均ベクトルは
$$M^{(c)} = (M^{(c)}_1, M^{(c)}_2,…, M^{(c)}_k)^T $$
ただし,
$$ M^{(c)} = \frac{1}{N^{(c)}}\sum_{n=1}^{N^{(c)}} x_{ni} $$

 
と書け、
また、分散共分散行列は
$$
S^{(c)} = \left[
\begin{array}{rrrr}
S^{(c)}_{11} & S^{(c)}_{12} & … & S^{(c)}_{1K} \\
S^{(c)}_{21} & S^{(c)}_{22} & … & S^{(c)}_{2K} \\
… & … & … & … \\
S^{(c)}_{K1} & S^{(c)}_{K2} & … & S^{(c)}_{KK}
\end{array}
\right]
$$
ただし,
$$ S^{(c)}_{ij} = \frac{1}{N^{(c)}} \sum_{n=1}^{N^{(c)}} (x_{ni} – M^{(c)}_{i})(x_{nj}-M^{(c)}_{j}) $$

という式で書くことが出来ます。

そして、実際にテストデータと各クラスとのマハラノビス距離を求める式は以下のように書くことが出来ます。

$$ d^{(c)}_m(x)=(x-M^{(c)})^T(S^{(c)})^{-1}(x-M^{(c)}) $$

この式から分かる通り、分散共分散行列Sの逆行列を利用しています。
なので、学習データが与えられた後にクラスごとの平均値とこの分散共分散行列の逆行列を求めます。

ちなみにユークリッド距離の式は
$$ d^{(c)}_e(x) = \sqrt{(x-M^{(c)})^T(x-M^{(c)})} $$
なので

分散共分散行列Sが単位行列Eのとき(S=Eのとき)
$$ d^{(c)}_m(x)=d^{(c)}_e(x) $$
となる関係があります。

 

マハラノビス距離の実装

少し複雑ですが、基本的に上の式にそのまま則ってるので、(pythonに慣れていれば)読めると思います。
xpと書かれていますが、numpy もしくは cupyで計算すると思ってください。

逆行列を求めるgetInverseは以下になります。
numpyでは逆行列は2×2までしか取得できないので、自分で実装しています。
実装方法としては掃き出し法を愚直に書いています。
逆行列が無い(行列式=0)時は単位行列を返します。
(最終的にでてくる距離がユークリッド距離の2乗になるので今のままではマハラノビス距離との単純な比較には使用できないので注意してください)

 

マハラノビス距離 を用いてクラスタリングしてみる

ページ上部にも貼りました以下の画像の黒い*点はどの属するでしょうか

実行してみます。
以下のコードでは実行毎にランダムに各クラスのデータのx,yとテストデータのx,yが決まります。
上の画像は以下のコードを実行した結果の一例です。

赤、青、緑の順に距離が出力されます。

マハラノビス距離では赤が6.64で一番近く、次に緑の17.82です。
一方、ユークリッド距離では緑が17.90で一番近く、次に赤の24.06という結果になりました。

このようにユークリッド距離では平均のみを用いるので、場合によっては直感的に正しくない出力になります。
マハラノビス距離では分散を考慮しているので、平均値とは離れていても統計的にクラスタリング出来ることがわかります。

ということで、マハラノビス距離を用いた機械学習を実装してみたよ、でした。

 




コメントする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です