Python × AI - クラスタリング(HDBSCAN)

HDBSCANを使ってクラスタリングを行います。

HDBSCANは、DBSCANを階層型クラスタリングのアルゴリズムに変換したもので、階層DBSCAN(Hierarchical DBSCAN)と呼ばれることもあります。

密度でグループを作成し、そのグループを距離に基づいて順次まとめていきます。

ライブラリのインストールとデータ生成

まずHDBSCANのライブラリをインストールします。(1行目)

2行目以降でデータ生成を行います。

密度の異なる3つの塊データを作成しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
!pip install hdbscan 
centers = [[1, 0.5], [2, 2], [1, -1]]
stds = [0.1, 0.4, 0.2]
X = datasets.make_blobs(n_samples=1000, centers=centers, cluster_std=stds, random_state=0)[0]
x = X[:,0]
y = X[:,1]
plt.figure(figsize=(10,7))
plt.scatter(x, y)
plt.suptitle("blob")
plt.show

[実行結果]

クラスタリング

比較のため、HDBSCAN(1~7行目)とDBSCAN(9~16行目)でクラスタリングを行います。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print("\nDBSCAN")
dbscan = cluster.DBSCAN(eps=0.2, min_samples=10, metric="euclidean")
labels = dbscan.fit_predict(X)
df_dbscan = pd.DataFrame(X)
df_dbscan["cluster"] = labels
df_dbscan.columns = ["axis_0","axis_1","cluster"]
display(df_dbscan["cluster"].value_counts().sort_index())

import hdbscan
print("\nHDBSCAN")
hdbscan_ = hdbscan.HDBSCAN()
hdbscan_.fit(X)
df_hdbscan = pd.DataFrame(X)
df_hdbscan["cluster"] = hdbscan_.labels_
df_hdbscan.columns = ["axis_0","axis_1","cluster"]
display(df_hdbscan["cluster"].value_counts().sort_index())

[実行結果]

DBSCANは外れ値(-1)が少しありますが、HDBSCANは3つに分類されています。

クラスタリング結果の可視化

各クラスタリング結果を可視化します。

[Google Colaboratory]

1
2
3
4
5
6
7
plt.figure(figsize=(10,3))
plt.suptitle("dbscan")
sns.scatterplot(x="axis_0", y="axis_1", hue="cluster", data = df_dbscan)

plt.figure(figsize=(10,3))
plt.suptitle("hdbscan")
sns.scatterplot(x="axis_0", y="axis_1", hue="cluster", data = df_hdbscan)

[実行結果]

HDBSCAN(下図)は、塊ごとの密度の違いに対応できるアルゴリズムのため、きちんと3つに分類されています。

DBSCAN(上図)は密度の低い塊はノイズになっているようです。

2つのクラスタリングの使い分けポイントとしては、塊ごとに密度が違うかどうかという点になります。