无监督聚类 -- Affinity Propagation

15 篇文章 0 订阅
8 篇文章 1 订阅

无监督聚类 – Affinity Propagation

作者:钱魏Way

copy地址:https://www.biaodianfu.com/affinity-propagationap.html

AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法。AP算法的基本思想是将全部数据点都当作潜在的聚类中心(称之为exemplar),然后数据点两两之间连线构成一个网络(相似度矩阵),再通过网络中各条边的消息(responsibility和availability)传递计算出各样本的聚类中心。

请添加图片描述

=====================================================================
AP算法中的特殊名词

  • Exemplar:指的是聚类中心,K-Means中的质心。
  • Similarity(相似度):点j作为点i的聚类中心的能力,记为S(i,j)。一般使用负的欧式距离,所以S(i,j)越大,表示两个点距离越近,相似度也就越高。使用负的欧式距离,相似度是对称的,如果采用其他算法,相似度可能就不是对称的。
  • Preference:指点i作为聚类中心的参考度(不能为0),取值为S对角线的值(图1红色标注部分),此值越大,最为聚类中心的可能性就越大。但是对角线的值为0,所以需要重新设置对角线的值,既可以根据实际情况设置不同的值,也可以设置成同一值。一般设置为S相似度值的中值。
  • Responsibility(吸引度):指点k适合作为数据点i的聚类中心的程度,记为r(i,k)。如图2红色箭头所示,表示点i给点k发送信息,是一个点i选点k的过程。
  • Availability(归属度):指点i选择点k作为其聚类中心的适合程度,记为a(i,k)。如图3红色箭头所示,表示点k给点i发送信息,是一个点k选点i的过程。
  • Damping factor(阻尼系数):主要是起收敛作用的。

请添加图片描述

在实际计算应用中,最重要的两个参数(也是需要手动指定)是Preference和Damping factor。前者定了聚类数量的多少,值越大聚类数量越多;后者控制算法收敛效果。

==================================================================
AP算法流程

步骤1:算法初始,将吸引度矩阵R和归属度矩阵初始化为0矩阵;
步骤2:更新吸引度矩阵
在这里插入图片描述

步骤3:更新归属度矩阵步骤4:根据衰减系数 对两个公式进行衰减
在这里插入图片描述

步骤4:根据衰减系数λ对两个公式进行衰减
在这里插入图片描述

重复步骤2,3,4直至矩阵稳定或者达到最大迭代次数,算法结束。
最终取a+r最大的k作为聚类中心。

===================================================================

Python的机器学习库sklearn中已经实现了AP算法,可以直接调用。

参数设置介绍:

  • damping : 衰减系数,默认为5
  • convergence_iter : 迭代次后聚类中心没有变化,算法结束,默认为
  • max_iter : 最大迭代次数,默认
  • copy : 是否在元数据上进行计算,默认True,在复制后的数据上进行计算。
  • preference : S的对角线上的值
  • affinity :S矩阵(相似度),默认为euclidean(欧氏距离)矩阵,即对传入的X计算距离矩阵,也可以设置为precomputed,那么X就作为相似度矩阵。

训练完AP聚类之后可以获得的结果有

  • cluster_centers_indices_ : 聚类中心的位置
  • cluster_centers_ : 聚类中心
  • labels_ : 类标签
  • affinity_matrix_ : 最后输出的A矩阵
  • n_iter_ :迭代次数

==========================================================================

from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs
import numpy as np

# 生成测试数据
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.5, random_state=0)

# AP模型拟合
af = AffinityPropagation(preference=-50).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_
new_X = np.column_stack((X, 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'))
print('Top 10 sapmles:', new_X[:10])

# 图形展示
import matplotlib.pyplot as plt
from itertools import cycle

plt.close('all')
plt.figure(1)
plt.clf()

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
    class_members = labels == k
    cluster_center = X[cluster_centers_indices[k]]
    plt.plot(X[class_members, 0], X[class_members, 1], col + '.')
    plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=14)
    for x in X[class_members]:
        plt.plot([cluster_center[0], x[0]], [cluster_center[1], x[1]], col)

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()
Estimated number of clusters: 3
Homogeneity: 0.872
Completeness: 0.872
V-measure: 0.872
Adjusted Rand Index: 0.912
Adjusted Mutual Information: 0.871
Silhouette Coefficient: 0.753
Top 10 sapmles: [[ 1.47504421  0.9243214   0.        ]
 [-0.02204385 -0.80495334  1.        ]
 [-1.17671587 -1.80823709  2.        ]
 [ 0.77223375  1.00873958  0.        ]
 [ 1.23283122  0.23187816  0.        ]
 [-0.92174673 -0.88390948  2.        ]
 [ 1.65956844 -1.44120941  1.        ]
 [ 0.33389417 -1.98431234  1.        ]
 [-1.27143074 -0.79197498  2.        ]
 [ 1.33614738  1.20373092  0.        ]]

在这里插入图片描述

===========================================================================

优点

  • 聚类结果稳定,不受初始质心选择的影响
  • 不需要先验设定聚成几类
  • 对距离矩阵的对称性没要求。AP通过输入相似度矩阵来启动算法,因此允许数据呈非对称,数据适用范围非常大。

缺点

  • AP聚类应用中需要手动指定Preference和Damping factor,这其实是原有的聚类“数量”控制的变体
  • big O是 N^2(N是样本数量),所以样本数量越大运行时间越久。最好使用稀疏矩阵,密集矩阵会增加很多运算时间。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AP(affinity propagation聚类也被称为近邻传播聚类,它是一种半监督聚类算法。与传统的聚类方法不同,AP聚类不需要事先设定聚类簇的个数,而是通过分析数据点之间的相似性来自动划分数据集。 AP聚类的核心思想是任意两个数据点之间的相似性传播。相似性可以通过计算数据点之间的相似度来衡量,相似度可以是一种度量或者一个简单的距离函数。AP聚类算法中的相似度矩阵表示每对数据点之间的相似性。 AP聚类的过程如下:首先,初始化数据点的选择集合,将其作为当前候选出的聚类中心。然后,通过迭代更新两个矩阵:归属度矩阵和候选出矩阵。归属度矩阵表示每个数据点归属于每个聚类中心的程度,而候选出矩阵表示每个数据点是否被选择为聚类中心的候选。 在每次迭代中,首先更新归属度矩阵。对于每个数据点,计算其与其他数据点的相似性,选择与其相似度最高的数据点作为其聚类中心,同时更新其他数据点对该聚类中心的归属度。接下来,更新候选出矩阵。对于每个数据点,计算其与其他数据点的归属度之和,如果该和大于一个阈值,则将其设置为聚类中心的候选。 通过反复迭代更新归属度矩阵和候选出矩阵,直到算法收敛为止。最终,聚类中心将作为数据点的标签,每个数据点将被划分到与其最相似的聚类中心。 AP聚类的优点是不需要预先设定聚类簇的个数,可以自动发现数据集中的聚类结构。然而,由于其计算和存储相似性矩阵的复杂性,AP聚类对于大规模数据集的处理效率较低。同时,由于其依赖于阈值的选择,AP聚类的结果对于参数的选择较为敏感。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值