Python scikit-learn DBSCANでクラスタリングする

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

DBSCANとは

DBSCANはクラスタに属さないデータポイントも判別できるアルゴリズム。

各データポイントは距離esp内にmin_samplesの他データポイントがあるか確認し、存在する場合は範囲内のデータポイントをクラスタ化する。

距離esp内のデータポイントがmin_samples数に満たない場合はノイズとなる。


espとmin_samplesの可視化

f:id:letitride:20200729101018p:plain:w500


DBSCANの使用

from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler

X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
scaler = StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)

dbscan = DBSCAN()
cluster = dbscan.fit_predict(X_scaled)
plt.scatter(X_scaled[:, 0], X_scaled[:,1], c=cluster, cmap=mglearn.cm2, s=60)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

make_moonsのような形状のデータポイントでも近い集団を判別するので正しく判別できる。

f:id:letitride:20200729101530p:plain:w500


DBSCANが機能しないケース

データポイントの性質がespとmin_samplesの値にfitしない場合(データポイント数が少ない、min_samples数が多い)、うまく機能しない。

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs

X, y = make_blobs(random_state=0, n_samples=12)
dbscan = DBSCAN()
cluster = dbscan.fit_predict(X)
print("Cluster memberships:\n{}".format(cluster))

データポイント数が少ないケース。各データポイントはmin_samples数を満たせず、すべてがノイズとして判断されてしまう。

Cluster memberships:
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1]