简介
在本实验中,我们将学习如何使用亲和传播(Affinity Propagation)算法对数据集进行聚类。亲和传播算法是一种聚类算法,它不需要预先定义聚类的数量,并且能够根据输入数据自动确定聚类的数量。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”(Notebook)标签页,以访问 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 个聚类之一。我们将在二维空间中生成一个包含 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
)
计算亲和传播
我们将使用 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()
总结
在这个实验中,我们学习了如何使用亲和传播算法对数据集进行聚类。我们生成了一个示例数据集,使用亲和传播算法进行聚类,并绘制了聚类结果。我们还使用各种指标评估了聚类的质量。