亲和力传播聚类算法演示

亲和力传播聚类算法是一种基于数据点之间传递信息的聚类方法。该算法不需要预先指定簇的数量,能够自动确定簇的数量和簇的中心。在本演示中,将生成一组样本数据,并使用亲和力传播聚类算法对其进行聚类分析。

数据生成

首先,需要生成一组样本数据。这里使用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、均值漂移等。这些算法在不同的应用场景下有不同的优势和局限性。通过比较这些算法的性能,可以更好地理解它们的适用条件和优缺点。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485