DBSCANで簡単クラスタリング

2020年9月15日

 クラスタリングというと今ですとコロナのクラスタリングですが、機械学習のクラスタリングといえば似たようなものをうまく集約してくれる方法ですね。クラスタリングにもいろんな手法がありますが、scikit-learnの中にDBSCANというものがありますが、あまりの簡単さにびっくりしてしまいましたので、簡単に使い方をまとめたいと思います。

こちらを参考にしました。

https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html

こちらの公式ページのサンプルは二次元の点をクラスタしてますが、更に簡素化して一次元のデータをクラスタリングしてみます。ちなみにdata_list=[1.1, 0.1,10.2,10.3, 99]とかやっちゃうとダメですね。0の辺りの数字が2つ、10の辺りの数字が2つ、ハズレ値が1つと判定してみたい、と想定です。

#dbscan.py

from sklearn.cluster import DBSCAN
import numpy as np

data_list=[[1.1], [0.1],[10.2],[10.3], [99]]
X = np.array(data_list)

clustering = DBSCAN(eps=3, min_samples=2).fit(X)
print(clustering.labels_)

実行してみます。

$ python dbscan.py

 結果はこんなですね。

[ 0  0  1  1 -1]

99はハズレ値(-1が出力)ですが、min_sample=1に変更すると出力が替わりますね。1個だけでもクラスタの一つとみなすってことですね。

[0 0 1 1 2]

esp(イプシロン)を大きくしていくとクラスタが大きくなってくるイメージですかね。

eps=10とすると、、

[0 0 0 0 1]

と0と10 の辺りの数値も同じクラスタと認識されますね。

eps=100とすると、もう全部同一クラスタと認識されますね。

[0 0 0 0 0]

他にもパラメータがあるようですが、eps(イプシロン)とmin_sample(クラスタの最小構成数)を決めれば簡単な問題であれば集約する関数を自作するより遥かに便利そうですね。

ちなみにscikit-learnのインストールも簡単ですね。これだけと思います。

$ pip install scikit-learn