はじめに
この実験では、Affinity Propagation アルゴリズムを使ってデータセットにクラスタリングを行う方法を学びます。Affinity Propagation アルゴリズムは、事前にクラスタ数を定義する必要がないクラスタリングアルゴリズムであり、入力データに基づいて自動的にクラスタ数を決定することができます。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
クラスタリングを行い、サンプルデータを生成するために必要なライブラリをインポートして始めましょう。
import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
サンプルデータを生成する
sklearn.datasets モジュールの make_blobs 関数を使ってサンプルデータセットを生成します。make_blobs 関数は、n 次元空間の点のデータセットを生成し、各点は k 個のクラスタの 1 つに属します。ここでは、2 次元空間に 300 個の点からなるデータセットを生成し、3 つのクラスタと標準偏差 0.5 で生成します。
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(
n_samples=300, centers=centers, cluster_std=0.5, random_state=0
)
Affinity Propagation を計算する
データセットにクラスタリングを行うために、sklearn.cluster モジュールの AffinityPropagation クラスを使います。クラスタ数を制御する preference パラメータを -50 に設定します。preference の値が低いほど、生成されるクラスタ数が多くなります。その後、クラスタリングの品質を評価するためのいくつかの指標を表示します。
af = AffinityPropagation(preference=-50, random_state=0).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_
n_clusters_ = len(cluster_centers_indices)
print("Estimated number of clusters: %d" % n_clusters_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f" % metrics.adjusted_rand_score(labels_true, labels))
print(
"Adjusted Mutual Information: %0.3f"
% metrics.adjusted_mutual_info_score(labels_true, labels)
)
print(
"Silhouette Coefficient: %0.3f"
% metrics.silhouette_score(X, labels, metric="sqeuclidean")
)
結果をプロットする
matplotlib ライブラリを使って、結果として得られたクラスタをプロットします。各クラスタをループして、そのクラスタに属する点と、クラスタ中心と、クラスタ内の各点と中心を結ぶ線をプロットします。
plt.close("all")
plt.figure(1)
plt.clf()
colors = plt.cycler("color", plt.cm.viridis(np.linspace(0, 1, 4)))
for k, col in zip(range(n_clusters_), colors):
class_members = labels == k
cluster_center = X[cluster_centers_indices[k]]
plt.scatter(
X[class_members, 0], X[class_members, 1], color=col["color"], marker="."
)
plt.scatter(
cluster_center[0], cluster_center[1], s=14, color=col["color"], marker="o"
)
for x in X[class_members]:
plt.plot(
[cluster_center[0], x[0]], [cluster_center[1], x[1]], color=col["color"]
)
plt.title("Estimated number of clusters: %d" % n_clusters_)
plt.show()
まとめ
この実験では、Affinity Propagation アルゴリズムを使ってデータセットにクラスタリングを行う方法を学びました。サンプルデータセットを生成し、Affinity Propagation アルゴリズムを使ってクラスタリングを行い、得られたクラスタをプロットしました。また、様々な指標を使ってクラスタリングの品質を評価しました。