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

  • sklearn.cluster.affinity_propagation()官方文档

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时才返回。

  • AffinityPropagation 物理意义

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’的认可程度(归属度),这两个值相加, a ( i , k ′ ) + s ( i , k ′ ) a(i,k') + s(i,k') a(i,k)+s(i,k),就可以计算出节点k’作为节点i的聚类中心的合适程度了,这里,在所有其他节点k’中,找出最大的a(i,k’) + s(i,k’),即 m a x a ( i , k ’ ) + s ( i , k ′ ) max{a(i,k’)+s(i,k')} maxa(i,k)+s(i,k),再使用 s ( i , k ) − m a x a ( i , k ’ ) + s ( i , k ′ ) s(i,k) - max{a(i,k’)+s(i,k')} s(i,k)maxa(i,k)+s(i,k) 就可以得出k对i的吸引度了,也就是一个样本 k 要成为样本 i 的exemplar的 responsibility 由下式给出:

r ( i , k ) ← s ( i , k ) − m a x [ a ( i , k ′ ) + s ( i , k ′ ) ∀ k ′ ≠ k ] r(i,k)\leftarrow s(i,k)-max[a(i,k')+s(i,k')\forall k'\neq k] r(i,k)s(i,k)max[a(i,k)+s(i,k)k̸=k]

​ 其中 s(i,k) 是样本 k 和样本 i 之间的相似度,是一个输入量,一般采用欧式距离的负值表示,即s(i,j)值越大表示点i与j的距离越近,AP算法中理解为数据点k作为数据点i的聚类中心的能力。
s ( i , k ) = s u m ( ( x ( i ) − x ( k ) ) 2 ) s(i,k) = sum((x(i)-x(k))^2) s(i,k)=sum((x(i)x(k))2)
​ 根据相似度公式有s(k,k) = 0,由于s(k,k)表征的是数据点x(k)成为聚类中心的能力大小,即偏好参数,所以就不能根据测度性质将其设置为0,而应该结合其他数据点来共同确定。AP算法认为,迭代开始之前所有数据点成为聚类中心的能力大小相同,所以对于所有数据点设置相同的偏好参数,一般选择为所有相似度值的最小值或者中值,即s(k,k) = min(s(i,j))(i,j=1,2,…N)或者s(k,k) = median(s(i,j))(i,j=1,2,…N)。s(k,k)越大,表征任意数据点x(k)成为聚类中心的能力越强,则最终聚类数目越大;反之,则最终聚类数目越小

​ 此时只考虑哪个点k成为点i的聚类中心的可能性最大,但是没考虑这个吸引度最大的k是否也经常成为其他点的聚类中心(即归属度),若点k只是点i的聚类中心,不是其他任何点的聚类中心,则会造成最终聚类中心个数大于实际的中心个数。

  1. availability a(i,k) : 样本 i 应该选择样本 k 作为它的典型代表(exemplar)的累计证据, 可称为归属度

    这里要考虑到的一个思想是:如果节点k作为其他节点i’的聚类中心的合适度很大,那么节点k作为节点i的聚类中心的合适度也可能会较大,由此就可以先计算节点k对其他节点的吸引度,r(i’,k),然后做一个累加和表示节点k对其他节点的吸引度:
    a ( k , k ) ← ∑ m a x ( 0 , r ( i ′ , k ) ) a(k,k) \leftarrow \sum max({0,r(i',k)}) a(k,k)max(0,r(i,k))
    这里在r(i’,k)跟0之间取一个大的原因是因为s(i’,k)一般会初始化成负值,导致r(i’,k)计算出来也有可能是负值,这样的好处是,最后可以方便找出合适的聚类中心在完成所有计算后。

    样本 k 要成为样本 i 的exemplar的 availability 由下式给出:

a ( i , k ) ← m i n [ 0 , r ( k , k ) + ∑ i ′ s . t . i ′ ∉ i , k m a x ( 0 , r ( i ′ , k ) ) ] a(i,k)←min[0,r(k,k)+\sum_{i′ s.t. i′∉{i,k}}max(0,r(i′,k))] a(i,k)min[0,r(k,k)+is.t.i/i,kmax(0,r(i,k))]

​ 在开始的时候, r 和 a 中的所有值被设为 0, 并且迭代计算到收敛为止。 为了防止更新messages时出现数据振荡,在迭代过程中引入阻尼因子 λ :
$$
r_{t+1}(i,k)=λ⋅r_t(i,k)+(1−λ)⋅r_{t+1}(i,k)\

a_{t+1}(i,k)=λ⋅a_t(i,k)+(1−λ)⋅a_{t+1}(i,k)
$$
其中 t 是迭代次数。

​ 用这种方式, exemplars被选择是因为这些exemplars满足了两个条件:

(1)它们与很多样本足够相似;

(2)它们被很多样本选择作为自己的代表。

  • Affinity Propagation算法流程

  1. 更新相似度矩阵中每个点的吸引度信息,计算归属度信息;
  2. 更新归属度信息,计算吸引度信息;
  3. 对样本点的吸引度信息和归属度信息求和,检测其选择聚类中心的决策;若经过若干次迭代之后其聚类中心不变、或者迭代次数超过既定的次数、又或者一个子区域内的关于样本点的决策经过数次迭代后保持不变,则算法结束。

将聚类过程看成选举:

  • 所有人都参加选举(大家都是选民也都是参选人),要选出几个作为代表

  • s(i,k)就相当于i对选k这个人的一个固有的偏好程度

  • r(i,k)表示用s(i,k)减去最强竞争者的评分,可以理解为k在对i这个选民的竞争中的优势程度

  • r(i,k)的更新过程对应选民i的各个参选人的挑选(越出众越有吸引力)

  • a(i,k):从公式里可以看到,所有r(i’,k)>0的值都对a有正的加成。对应到我们这个比喻中,就相当于选民i通过网上关于k的民意调查看到:有很多人(即i’们)都觉得k不错(r(i’,k)>0),那么选民i也就会相应地觉得k不错,是个可以相信的选择

  • a(i,k)的更新过程对应关于参选人k的民意调查对于选民i的影响(已经有了很多跟随者的人更有吸引力)

  • 两者交替的过程也就可以理解为选民在各个参选人之间不断地比较和不断地参考各个参选人给出的民意调查。

  • r(i,k)的思想反映的是竞争,a(i,k)则是为了让聚类更成功。

  • Reference

  1. 吸引子传播
  2. 对AP(Affinity Propagation)聚类算法的理解
  3. AP算法中两个参数的交替过程怎么样通俗的理解?
  4. Affinity Propagation: AP聚类算法
  5. 聚类(6)-- Affinity Propagation Clustering
  6. scikit-learn 源码解读之Affinity Propagation聚类 [推荐]
  7. 聚类算法Affinity Propagation(AP)

你可能感兴趣的:(#,小白学机器学习,#,小白学Python,cluster,吸引子传播,聚类)