对AP(Affinity Propagation)聚类算法的理解

来源:互联网 发布:python 强制终止线程 编辑:程序博客网 时间:2024/05/22 15:29

这段时间因为工作需要,了解了一些聚类算法,发现目前国内的一些资料中对于AP(Affinity Propagation)聚类算法的描述和理解局限在列举公式,说明计算流程层面,没有去深入解读,为什么要这样设计公式,以及AP的核心思想。

首先简要介绍一下AP算法,跟其他聚类算法的不同之处是,AP在开始时,将所有节点都看成潜在的聚类中心,然后通过节点之间的通信,去找出最合适的聚类中心,并将其他节点划分到这些中心下去,所以我们可以认为,AP算法所要做的事情就是去发现这些聚类中心。

AP的输入是一个节点间的相似度矩阵,S,其中S(i,j)表示节点i和节点j之间的相似度,也表明了,j作为i的聚类中心的合适程度,这个相似度的计算可以根据具体应用场景,这里未免误导不作相似度的假设。其中S(k,k)表示节点k作为k的聚类中心的合适程度,可以理解为,节点k成为聚类中心合适度,在最开始时,这个值是初始化的时候使用者给定的值,会影响到最后聚类的数量。

AP中节点间传递的消息为两类:吸引度和归属度。

首先,吸引度是节点i传递向节点k的信息,传达了节点k对节点i的吸引度,记为r(i,k),那么如何来衡量这个吸引度,其实吸引度是一个相对的概念,先前我们有相似度矩阵记录了k成为i的聚类中心的合适程度,那么这里我们只需要证明k比其他节点更合适了就可以了,那么其他节点是否合适这个如何进行衡量呢,是否合适其实就是看这两个节点是否相互认可,对于其他节点k'我们有s(i,k')表示节点k'作为节点i的聚类中心的合适度,那么再定义一个a(i,k')表示i对节点k'的认可程度(归属度),这两个值相加,a(i,k') + s(i,k'),就可以计算出节点k'作为节点i的聚类中心的合适程度了,这里,在所有其他节点k'中,找出最大的a(i,k') + s(i,k'),即max{a(i,k’)+s(i,k')},再使用s(i,k) - max{a(i,k’)+s(i,k')} 就可以得出k对i的吸引度了,也就是第一个公式:

r(i,k) = s(i,k) - max{a(i,k’)+s(i,k')} 其中k != k'

接下来计算上面提到的归属度a(i,k),表示了节点i选择节点k作为它的聚类中心的合适程度,这里要考虑到的一个思想是:如果节点k作为其他节点i'的聚类中心的合适度很大,那么节点k作为节点i的聚类中心的合适度也可能会较大,由此就可以先计算节点k对其他节点的吸引度,r(i',k),然后做一个累加和表示节点k对其他节点的吸引度:

∑max{0,r(i',k)} ps.这里在r(i',k)跟0之间取一个大的原因是因为s(i',k)一般会初始化成负值,导致r(i',k)计算出来也有可能是负值,这样的好处是,最后可以方便找出合适的聚类中心在完成所有计算后。

然后再加上r(k,k),这里为什么要加上r(k,k),根据吸引度公式,我们可以看出,其实r(k,k),反应的是节点k有多不适合被划分到其他聚类中心下去,这里的公式中,将k有多适合成为其他节点的聚类中心:∑max{0,r(i',k)}加上它有多不适合被划分到其他聚类中心下去:r(k,k) 就有了计算公式:

a(i,k)=min{0,r(k,k)+∑max{0,r(i',k)}} 为了不让这个值过大,影响整体结果,将这个值控制在0以下。

其中a(k,k)的定义稍微有些不一样,只用∑max{0,r(i',k)}就可以了 主要反映k作为聚类中心的能力。

有了以上两个公式后,就可以进行AP的计算流程了,这个计算流程很多文章里面都有讲,这里就不再赘述了,后续会将这个算法并行化,留在后面再去讨论并行计算流程。



1 0
原创粉丝点击