混合ガウスモデルについて調べた（その２）

[前回](https://qiita.com/panda531/items/da283a5fee7e58c4cdc6)の続きです。

# 他のクラスタリング手法との比較
距離ベースのクラスタリング手法であるk-meansと密度ベースのクラスタリング手法であるDBSCANと比較してみます。

k-meansについては[こちらのページ](https://qiita.com/panda531/items/4b5504a3949eacb7ab19)で少し解説しています。簡単に言うと、各データ点を最も近いクラスタに所属させて新しいクラスタ重心を計算するということを繰り返してクラスタを構築していきます。
DBSCANは指定した密度以上のデータ点集合を探して、それらをニョキニョキ成長させることでクラスタを構築する手法です。
k-meansの場合は距離ベースなので二次元データでは円形、三次元データでは球形のクラスタ構築しか出来ないことがわかっています。DBSCANは密度ベースなのでk-meansよりもより複雑な形状に対応することが可能です。

以下は実際に[前回](https://qiita.com/panda531/items/da283a5fee7e58c4cdc6)のデータを使って各手法でクラスタリングした結果です。
混合ガウスモデル、k-means、DBSCANの順番で図示しています。

## 一次元データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6a699a50-3b11-3d50-3978-d2e0e9feec8a.png)

混合ガウスモデルとk-meansはほぼ同じ結果になっています。
DBSCANについてはなんとかそれっぽくなるようなパラメータを探しましたがこのくらいが限度でした。ただ、本来のクラスタ数を知らない前提ならきれいにクラスタが構築されていると思います。

## 次はX!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/8edba9d2-632b-eae0-d85f-542556c3d3a6.png)

各手法の特徴が良くでています。
このデータは２本の線をクロスさせたような形になっており、それぞれの線はガウス分布に従って生成したような感じです。
よって、混合ガウスモデルでは、どちらかの線を選択して一つのクラスタとしており、もう片方の線は途中で分断されていますが一つのクラスタとしています。
k-meansは距離ベースのクラスタリング手法であり、今回のようなデータは分離できません。下図の[公式の例](https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html)にもあるように、k-meansによって構築したクラスタをエリア別に図示すると以下のようになり、クラスタエリアの境界は直線になります。今回の例でもきれいに直線になっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/67cf92c2-5177-948a-744d-c68a6b767a10.png)

DBSCANについてはなんとかXの中心部分を一つのクラスタにするようにパラメータ設定してみました。密度ベースなので、密度の高い部分をクラスタとして構築していきます。（全データが表示されていませんが、表示されていないデータ点はどのクラスタにも含まれなかったことを表しています。）

## 密度の異なるデータ
お次はこれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/98fb509b-3248-5b79-145f-2b4ce0937156.png)

今回は混合ガウスモデルとDBSCANが同じような結果となり、k-meansはさきほどのデータと同じように直線でクラスタ境界が引かれています。
ただし、DBSCANは与えられたデータに存在する各クラスタの密度がある程度同じことを前提としているので上手に分割するためのパラメータ選択はかなりシビアです。
一方、混合ガウスモデルは各クラスタに対応するガウス分布の分散のパラメータによってその密度を変更することが出来ます。
つまり、各クラスタの密度が異なることが想定されるデータに対しては混合ガウスモデルを使ったほうが良さそうです。

## きれいなデータ
はい次。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/78dc6cba-64c8-69ba-620c-a1f48fb61c6c.png)

このデータはどれも同じような結果にすることができました。ただし、DBSCANのパラメータ選択はやはり少し難しいです。探索半径を表すパラメータ`eps`のスケールがデータによって違いすぎるので、データを正規化したあとに適用したほうが良さそうです。（普通そうするのかもしれませんがどなたか教えてください。。。）

## 混合ガウスモデルできれいにクラスタ構築できないデータ
最後はこれです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/a8f816f1-7c9e-7bdf-368c-1911d899f98a.png)

このデータではDBSCANのみ正しくクラスタ構築できています。
DBSCANは密度ベースのクラスタリング手法なので、同じような密度でニョキッと伸びているようなクラスタはパラメータさえきちんと設定すれば見つけてくれます。
k-meansは二次元上では円形にデータを探索していくのでこのデータを分離することはできません。
混合ガウスモデルはそもそもガウス分布に従って生成されたデータがあることを前提としており、このデータのような形の場合は見つけることができません。（[前回](https://qiita.com/panda531/items/da283a5fee7e58c4cdc6)にも書いたとおり、二次元上ではガウス分布に従うデータは中心が濃い円形のような形になります）

（追記）
[公式](https://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html)に色んなデータを色んな手法でクラスタリングした結果が載っていました。
ドキュメントすごく充実してる感じなので参考にしていきたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/1fb05541-55eb-0b03-cd01-45a7be409033.png)


# その３に続く
その３では混合ガウスモデルで最適なクラスタ数を選ぶための指標AICやBICについてやEMアルゴリズムについて書く予定です！（予定）