sklearn.cluster.affinity_propagation()结构、用法及AP算法详解

sklearn.cluster.affinity_propagation(S, preference=None, convergence_iter=15, max_iter=200, damping=0.5, copy=True, verbose=False, return_n_iter=False)

Affinity Propagation 算法比较有趣的是可以根据提供的数据决定聚类的数目。 因此有两个比较重要的参数:

  1. preference: 参考度或称为偏好参数:是相似度矩阵中横轴纵轴索引相同的点,如s(i,i),若按欧氏距离计算其值应为0,但在AP聚类中其表示数据点i作为聚类中心的程度,因此不能为0。迭代开始前假设所有点成为聚类中心的能力相同,因此参考度一般设为相似度矩阵中所有值得最小值或者中位数,但是参考度越大则说明个数据点成为聚类中心的能力越强,则最终聚类中心的个数则越多;
  2. damping factor: 阻尼因子,用于减少吸引信息和归属信息以防止更新减少吸引度和归属度信息时数据振荡。

AP聚类算法主要的缺点是算法的复杂度。 AP聚类算法的时间复杂度是 O ( N 2 T ) O(N^2T) O(N2T), 其中 N 是样本的个数 , T 是收敛之前迭代的次数。如果使用密集的相似性矩阵空间复杂度是 O ( N 2 ) O(N^2) O(N2) ,如果使用稀疏的相似性矩阵空间复杂度可以降低。 这使得AP聚类最适合中小型数据集(small to medium sized datasets)。

其他参数:

damping=0.5: 阻尼系数,设置为 0.5 到 1 之间;
max_iter=200: 最大迭代次数;
convergence_iter=15: 聚类个数连续 convergence_iter 次迭代都不再改变,就停止迭代;
copy=True: 在 scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据进行 copy 操作,以便不修改用户的输入数据;
preference=None: array-like, shape (n_samples,) 或者 float,如果不指定,则都设为相似度矩阵中的中位数;
affinity=’euclidean’: string,“precomputed” 或者 “euclidean”,“euclidean” 采用负的欧几里得距离(class中的参数)

verbose=False: int 类型,是否输出详细信息

函数返回结果:

cluster_centers_indices : array, shape (n_clusters,) 聚类中心在所有数据中的索引,聚类中心是已有数据点。

labels : array, shape (n_samples,) 聚类标签,每个记录对应的种类,默认是从0开始的数字

n_iter : int 运行的迭代次数,只有 return_n_iter参数设置维True时才返回。

Affinity Propagation Clustering是2007年在Science上发表的一篇single-exemplar-based的聚类方面的文章。特别适合高维、多类数据快速聚类,相比传统的聚类算法,从聚类性能和效率方面都有大幅度的提升。

Affinity Propagation Clustering 可翻译为:仿射传播聚类,吸引子传播聚类,近邻传播聚类,相似性传播聚类,亲和力传播聚类,以下简称 AP聚类.优点有:

  1. 不需要指定最终聚类族的个数
  2. 已有的数据点作为最终的聚类中心,而不是新生成一个族中心
  3. 模型对数据的初始值不敏感
  4. 对初始相似度矩阵数据的对称性没有要求
  5. 相比于k-centers聚类方法,其结果的平方差误差较小

AffinityPropagation 聚类方法是通过在样本对之间发送消息直到收敛来创建聚类。 然后使用少量示例样本作为聚类中心来描述数据集, 聚类中心是数据集中最能代表一类数据的样本。

​ 在样本对之间发送的消息表示一个样本作为另一个样本的示例样本的适合程度(suitability),适合程度值再根据通信的反馈不断更新。更新迭代直到收敛,完成聚类中心的选取,因此也给出了最终聚类。

​ **与其他聚类算法的不同之处是,AP在开始时,将所有节点都堪看成是潜在的聚类中心。**然后通过节点间的通信,找出最合适的聚类中心,并将其他节点划分到这些中心下去。所以,目标是找到聚类中心;手段是通过节点间通信。

  • Affinity Propagation算法描述

AP的输入是一个节点间的相似度矩阵:S。作为算法的初始化矩阵,n个点就有由n乘n个相似度值组成的矩阵。

用S(i,k)表示节点i和节点k之间的相似度,也表明了节点k作为i的聚类中心的合适程度,这个相似度S的计算可以根据具体应用场景。

算法描述: 样本之间传递的信息有两种,r(i,k)和a(i,k)不是并列关系:

  1. responsibility r(i,k) : 样本 k 适合作为样本 i 的典型代表(exemplar)的累计证据,可称为吸引度。是节点i传递给节点k的信息。先前我们有相似度矩阵记录了k成为i的聚类中心的合适程度,那么这里我们只需要证明k比其他节点更合适了就可以了,那么其他节点是否合适这个如何进行衡量呢,是否合适其实就是看这两个节点是否相互认可,对于其他节点k’我们有s(i,k’)表示节点k’作为节点i的聚类中心的合适度,那么再定义一个a(i,k’)表示i对节点k’的认可程度(归属度),这两个值相加,
### Affinity Propagation 算法简介 Affinity Propagation (AP) 是一种基于消息传递的聚类算法,它通过计算数据点之间的相似度来寻找具有代表性的样本作为聚类中心[^1]。该算法不需要预先指定聚类的数量 \(k\),而是通过调整偏好参数(preference parameter)来自适应地决定合适的簇数。 对于鸢尾花数据集(Iris Dataset),可以利用 AP 算法对其进行无监督学习并完成分类任务。以下是具体实现及其解析: --- ### 实现代码及解析 #### 导入必要的库 ```python import numpy as np from sklearn.cluster import AffinityPropagation from sklearn.datasets import load_iris from sklearn.metrics import adjusted_rand_score, silhouette_score ``` 上述代码导入了所需的 Python 库,其中 `sklearn` 提供了加载鸢尾花数据集以及执行 AP 聚类的功能[^2]。 --- #### 加载数据集 ```python data = load_iris() X = data.data # 特征矩阵 y_true = data.target # 真实标签 ``` 这里使用 `load_iris()` 函数获取鸢尾花数据集中的特征矩阵 \(X\) 和真实类别标签 \(y_{\text{true}}\)。这些数据将用于后续的模型训练和评估[^3]。 --- #### 构建与运行 AP 模型 ```python ap_model = AffinityPropagation(damping=0.9, max_iter=200, convergence_iter=15, preference=-50).fit(X) cluster_centers_indices = ap_model.cluster_centers_indices_ labels = ap_model.labels_ n_clusters = len(cluster_centers_indices) print(f"Estimated number of clusters: {n_clusters}") ``` 此部分定义了一个 AP 模型实例,并设置了关键超参数: - **damping**: 控制消息更新过程中的阻尼系数,默认值为 0.5;较高的值有助于稳定收敛。 - **max_iter**: 设置最大迭代次数以防止过长时间运行。 - **convergence_iter**: 判断是否达到收敛状态所需连续不变化的最大迭代轮次。 - **preference**: 影响最终产生的簇数量,通常设置为负值表示更少的簇[^4]。 调用 `.fit(X)` 方法后即可获得预测结果,包括每个簇对应的索引位置 (`cluster_centers_indices`) 及分配给各点所属的簇标记 (`labels`)。 --- #### 性能评估 ```python score_ar = adjusted_rand_score(y_true, labels) score_silhouette = silhouette_score(X, labels) print(f"Adjusted Rand Index Score: {score_ar:.3f}") print(f"Silhouette Coefficient Score: {score_silhouette:.3f}") ``` 为了衡量 AP 的性能表现,采用两种指标进行量化分析: - Adjusted Rand Index (\(ARI\)) 表示实际分组与预期分组之间的一致程度,取值范围 \([-1, 1]\),越接近于 1 效果越好; - Silhouette Coefficient 描述单一样本与其所在簇内部紧密性和外部分离性关系的程度,其理想区间位于 [0, 1] 内[^5]。 --- ### 完整代码展示 ```python import numpy as np from sklearn.cluster import AffinityPropagation from sklearn.datasets import load_iris from sklearn.metrics import adjusted_rand_score, silhouette_score # 数据准备 data = load_iris() X = data.data y_true = data.target # 建立 AP 模型 ap_model = AffinityPropagation(damping=0.9, max_iter=200, convergence_iter=15, preference=-50).fit(X) cluster_centers_indices = ap_model.cluster_centers_indices_ labels = ap_model.labels_ # 输出估计的簇数目 n_clusters = len(cluster_centers_indices) print(f"Estimated number of clusters: {n_clusters}") # 计算 ARI 和轮廓系数得分 score_ar = adjusted_rand_score(y_true, labels) score_silhouette = silhouette_score(X, labels) print(f"Adjusted Rand Index Score: {score_ar:.3f}") print(f"Silhouette Coefficient Score: {score_silhouette:.3f}") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值