数据点间传递消息的聚类分析

机器学习领域,聚类是一种无监督学习算法,其目的是将数据集中的样本划分为若干个簇,使得同一个簇内的样本相似度较高,而不同簇之间的样本相似度较低。本文将介绍一种基于数据点间传递消息的聚类方法——Affinity Propagation算法,并展示其在样本数据上的聚类效果。

生成样本数据

首先,需要生成一些样本数据。在本文中,使用make_blobs函数生成了300个样本点,这些样本点分布在三个不同的簇中心附近。每个簇中心的坐标分别为(1,1)、(-1,-1)和(1,-1),簇内的样本点会围绕这些中心点分布,并且具有一定的随机性。

Affinity Propagation算法

接下来,使用Affinity Propagation算法对样本数据进行聚类。Affinity Propagation算法是一种基于数据点间传递消息的聚类方法,它不需要预先指定簇的数量,而是通过迭代过程自动确定簇的数量。在每次迭代中,每个数据点都会向其他数据点发送一个消息,表示它成为簇中心的偏好程度。经过多次迭代后,算法会根据这些消息确定最终的簇中心和簇成员。

评估聚类效果

为了评估聚类效果,计算了多个指标,包括同质性(Homogeneity)、完备性(Completeness)、V-度量(V-measure)、调整后的Rand指数(Adjusted Rand Index)和调整后的互信息(Adjusted Mutual Information)。这些指标可以衡量聚类结果的准确性和稳定性。此外,还计算了轮廓系数(Silhouette Coefficient),用于衡量样本点在簇内的紧密程度。

可视化聚类结果

最后,使用matplotlib库对聚类结果进行了可视化。在可视化图中,每个簇的样本点用不同的颜色表示,簇中心用实心圆点表示。通过观察可视化图,可以直观地看到样本点的聚类效果。

代码实现

以下是使用Affinity Propagation算法进行聚类分析的Python代码实现:

import numpy as np from sklearn import metrics from sklearn.cluster import AffinityPropagation from sklearn.datasets import make_blobs # 生成样本数据 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 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")) # 可视化聚类结果 import matplotlib.pyplot as plt 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算法进行聚类,并评估聚类效果。最后,使用matplotlib库对聚类结果进行了可视化,以直观地展示聚类效果。

运行时间

整个脚本的运行时间为0分钟0.338秒,表明该算法在处理300个样本点时具有较快的计算速度。

以下是一些相关的聚类算法示例:

  • DBSCAN聚类算法演示
  • 均值漂移聚类算法演示
  • K-Means与MiniBatchKMeans聚类算法比较
  • 聚类性能评估中的偶然性调整
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485