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 算法比较有趣的是可以根据提供的数据决定聚类的数目。 因此有两个比较重要的参数:
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聚类.优点有:
AffinityPropagation 聚类方法是通过在样本对之间发送消息直到收敛来创建聚类。 然后使用少量示例样本作为聚类中心来描述数据集, 聚类中心是数据集中最能代表一类数据的样本。
在样本对之间发送的消息表示一个样本作为另一个样本的示例样本的适合程度(suitability),适合程度值再根据通信的反馈不断更新。更新迭代直到收敛,完成聚类中心的选取,因此也给出了最终聚类。
**与其他聚类算法的不同之处是,AP在开始时,将所有节点都堪看成是潜在的聚类中心。**然后通过节点间的通信,找出最合适的聚类中心,并将其他节点划分到这些中心下去。所以,目标是找到聚类中心;手段是通过节点间通信。
AP的输入是一个节点间的相似度矩阵:S。作为算法的初始化矩阵,n个点就有由n乘n个相似度值组成的矩阵。
用S(i,k)表示节点i和节点k之间的相似度,也表明了节点k作为i的聚类中心的合适程度,这个相似度S的计算可以根据具体应用场景。
算法描述: 样本之间传递的信息有两种,r(i,k)和a(i,k)不是并列关系:
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的聚类中心,不是其他任何点的聚类中心,则会造成最终聚类中心个数大于实际的中心个数。
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)+i′s.t.i′∈/i,k∑max(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)它们被很多样本选择作为自己的代表。
将聚类过程看成选举:
所有人都参加选举(大家都是选民也都是参选人),要选出几个作为代表
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)则是为了让聚类更成功。