在机器学习领域,聚类是一种无监督学习算法,其目的是将数据集中的样本划分为若干个簇,使得同一个簇内的样本相似度较高,而不同簇之间的样本相似度较低。本文将介绍一种基于数据点间传递消息的聚类方法——Affinity Propagation算法,并展示其在样本数据上的聚类效果。
首先,需要生成一些样本数据。在本文中,使用make_blobs
函数生成了300个样本点,这些样本点分布在三个不同的簇中心附近。每个簇中心的坐标分别为(1,1)、(-1,-1)和(1,-1),簇内的样本点会围绕这些中心点分布,并且具有一定的随机性。
接下来,使用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个样本点时具有较快的计算速度。
以下是一些相关的聚类算法示例: