Hard K-means法

今回の目的

Hard K-means法をすらすら書けるようになって、より理解したい。

Hard K-meansとは?

K平均法

教師無し機械学習法の一種です。1957年に発見されたので、ほぼ60年間も使われ続けていることになります。

入力データ

2つのGaussianの混合分布から生成します。全てのパラメータは定数とします。

P(x)=\displaystyle\frac{p}{\sqrt{2 \pi \sigma_1^2}} \exp(- \displaystyle\frac{(x-\mu_1)^2}{2 \sigma_1^2}) + \displaystyle\frac{1-p}{\sqrt{2 \pi \sigma_2^2}} \exp(- \displaystyle\frac{(x-\mu_2)^2}{2 \sigma_2^2})

実際にはRで以下のように生成します。

どんな分布になったかは次のように確認します。

hist

いい感じにクラスタリングしにくそう。あくまで最初のデータは、テストケースと同じ役割だと思って、コードを書き始めましょう。

何をするか

100個の点を見て、2つのクラスタに分解するプログラムを書きます。性能を目視で確認します。

コード

言語:Java

実行

5回目のイテレーションで収束します。さすが1次元、速い。

元がピークが1個のデータなのでこんなもんかな?逆にリアル?

clustered

もう少し分離したデータでやると次のようになりました。

hist3
発展

次は、こんな風にしようと思います。

  • 2次元でも動くプログラムを書く。
  • ユークリッド距離以外も採用する。
  • 多次元の斜めGaussianでも動くプログラムを書く。
  • もっと面白いデータを採用する。
  • Soft K-Meansにする。

まずは、2次元のデータに適用できるようにします。

入力データ

2つの2次元Gaussianの混合分布から生成します。

P(x)=\displaystyle\sum_{i=1}^{2}\sqrt{\displaystyle\frac{\det(A_i)}{2 \pi}} \exp(- \displaystyle\frac{1}{2}(\vec{x}-\vec{\mu_i})^tA_i(\vec{x}-\vec{\mu_i}))

実際にはRで以下のように生成します。

data1
何をするか

2次元上で、Gaussianが斜めってるときもクラスタリングできるようにします。

コードの変更点

前回まで点はDoubleで表現しましたが、今回からは次のPointクラスを作ります。
Javaで書いたときの長さ、やばいです。

やりたかったのは、ベクトル演算だけです。
あとは、コードのほかの部分をPointクラス対応させました。Java以外では生じない作業ですが、Javaは書きやすくて速くてライブラリが充実してるので仕方ないと思っています。

実行

2次元でも特に問題なく4~5回で収束します。(データのせいだとは思います)

clustered

クラスタリング出来ました。感動ですね!!

続き

「Hard K-means法」への2件のフィードバック

  1. ピンバック: 実践:Hard K-means法 | The Big Computing

  2. ピンバック: データサイエンス人気記事 - The Big Computing

コメントは受け付けていません。