亲和力传播聚类算法是一种基于数据点之间传递信息的聚类方法。该算法不需要预先指定簇的数量,能够自动确定簇的数量和簇的中心。在本演示中,将生成一组样本数据,并使用亲和力传播聚类算法对其进行聚类分析。
首先,需要生成一组样本数据。这里使用make_blobs
函数生成了300个样本点,这些样本点分布在三个不同的簇中。每个簇的中心坐标分别为(1,1)、(-1,-1)和(1,-1),簇内的标准差为0.5。
接下来,使用AffinityPropagation
类对样本数据进行聚类。在聚类过程中,设置了偏好参数preference=-50
,并指定了随机状态为0以保证结果的可重复性。聚类完成后,得到了簇的中心索引、每个样本点的簇标签以及估计的簇数量。
为了评估聚类结果的质量,计算了多个评价指标,包括同质性、完备性、V-度量、调整后的Rand指数、调整后的互信息和轮廓系数。这些指标从不同角度反映了聚类结果的准确性和稳定性。
最后,使用matplotlib
库对聚类结果进行可视化展示。在图中,每个簇的样本点用不同的颜色表示,簇中心用实心圆点表示。同时,还用线段连接了每个样本点与其所属簇的中心,以直观地展示样本点与簇中心之间的关系。
以下是实现亲和力传播聚类算法的Python代码。代码中包含了数据生成、聚类、结果评估和可视化展示的完整过程。
import numpy as np
from sklearn import metrics
from sklearn.cluster import AffinityPropagation
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成样本数据
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.5, random_state=0)
# 应用亲和力传播聚类
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("估计的簇数量: %d" % n_clusters_)
print("同质性: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("完备性: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-度量: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("调整后的Rand指数: %0.3f" % metrics.adjusted_rand_score(labels_true, labels))
print("调整后的互信息: %0.3f" % metrics.adjusted_mutual_info_score(labels_true, labels))
print("轮廓系数: %0.3f" % metrics.silhouette_score(X, labels, metric="sqeuclidean"))
# 可视化展示
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("估计的簇数量: %d" % n_clusters_)
plt.show()
运行上述代码后,得到了估计的簇数量为3,同质性、完备性、V-度量、调整后的Rand指数、调整后的互信息和轮廓系数等评价指标的值分别为0.872、0.872、0.872、0.912、0.871和0.753。这些指标表明聚类结果具有较高的准确性和稳定性。
除了亲和力传播聚类算法外,还有许多其他的聚类算法,如DBSCAN、均值漂移等。这些算法在不同的应用场景下有不同的优势和局限性。通过比较这些算法的性能,可以更好地理解它们的适用条件和优缺点。