機械学習:クラスタリング DBSCAN

クラスタの形状を問わないDBSCAN(Dentisy-based Spatial Clustering Application with Noise)とは、データポイントの局所的な密度に基づいてクラスタラベルを割り当てる方法で、データポイントを三つのカテゴリに分ける。

  • core point: 半径$${\epsilon}$$内に指定された定数以上の隣接点を持つ

  • border point:半径$${\epsilon}$$内には指定された定数未満の隣接点しかないが、$${\epsilon}$$内にcore pointがある。

  • noize point:上記以外のデータポイント

手順

  1. core point毎にクラスタを形成、もしくは半径$${\epsilon}$$内同士のcore pointでクラスタを結合する

  2. 其々のcore pointにborder pointを割り当てる

 DBSCANの実装はscikit-learnのdbscanで実装されている。
 例として、クラスタが球状でなく三日月型のクラスタを扱う。

from sklearn.datasets import make_moons

X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
plt.scatter(X[:, 0], X[:, 1])
plt.tight_layout()
plt.show()
moon clustre

このクラスタは球形をしていないので、ユークリッド距離測度だけを元にした学習法では分割できない。DBSCANのように、ユークリッド距離の$${\epsilon}$$とともに、密度(個数)をデータとして与えることで、クラスタリングが可能になる。
 core point周りの最小データポイント数を5として、DBSCANを行う。

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.2, min_samples=5, metric='euclidean')
y_db = db.fit_predict(X)

 y_dbは、其々のデータポイントのクラスタラベルが入っている。DBSCANではクラスタ数をアルゴリズムが判断する。
 結果を可視化する。

for i in range(len(np.unique(y_db))):
    plt.scatter(X[y_db == i, 0], X[y_db == i, 1],
            marker='o', s=40,edgecolor='black', label=i+1 )
    
plt.legend()
plt.tight_layout()
plt.show()


DBSCAN

この記事が気に入ったらサポートをしてみませんか?