AP算法实现解读

本文详细解析AP算法的Matlab和Python实现,包括Matlab代码中的矩阵运算及防止oscillations的策略,以及Python中使用sklearn库的关键步骤。通过理解公式和关键步骤,阐述了算法如何确定数据点的代表点。
摘要由CSDN通过智能技术生成

过而不悛,亡之本也。——《左传·襄公七年》

上文讲了算法数学表达式,本文就其Matlab实现以及Python实现进行代码解析,重点是理解其应用。
matlab表达式的解读是原论文已经粘贴出来的,所以直接摘抄,希望能在矩阵运算上一探究竟。
python的实现基于sklearn工具包。

Matlab 代码解读

原数学表达式为:
这里写图片描述
下面这段代码是论文中给出的示例matlab代码,但是有助于我们了解基本的实现思路。在没有考虑稀疏的相似度矩阵时:

这里写图片描述

下面进行解读:
S为一个N×N的相似度矩阵,N为数据点的数目,A和R都初始化为N×N的相似度矩阵。
第二行的作用是,主要为了防止oscillations, 该情况的发生如S是一个对称矩阵,那么a点作为b点的代表点或是相反,二者计算出来的值是一样的,那么就会引起oscillations。另外一种情况,假如我们的S是一个整数矩阵,算法可能会得到多个具有相同的网相似度的求解,算法也可能在这几个解之间oscillate。通过在S上添加机器精度级的随机噪声有助于避免这种情况。
dampening的设置也是为了防止oscillation。
算法设定的迭代次数为100次,没有early stop的步骤。但是这个显然是可以优化的。

这里写图片描述

第6行~第7行,首先计算a+s,随后第一个max求出每一行的最大值,以及通过对最大值赋值为无穷小,同时得出次大值。把行看成对应i,把列看成对应为k’。之所以这么做是用到了一个trick,就是如果k对应的是最大值,那么我们在随后第9行的赋值,使得最终使用的次大值,也就是 kk 时的结果。而如果k对应的不是最大值,最终使用最大值的结果,仍然满足 kk 中最大值的要求。
举个例子 ,假设我们固定i=1,这一行的s(i,k)+a(i,k)依次为:
1 5 2 3 4 这时最大值为5,4是次大值,此时我们计算方法为:

k =1 k=2 k=3 k=4 k=5
s(1,1)-5 s(1,2)-5 s(1,3)-5 s(1,4)-5 s(1,5)-5

随后对最大项下标对应位置2重新赋值为:s(1,2)-4

k =1 k=2 k=3 k=4 k=5
s(1,1)-5 s(1,2)-4 s(1,3)-5 s(1,4)-5 s(1,5)-5

就是除去该列之外的最大值。
dampenling 是为了避免数值上的oscillations,所以使用了一定的权值来进行平滑的过度。一般设定在[0.5,1)之间。

这里写图片描述
先理解公式,对于每一列,计算的是来自除去矩阵对角线的所有正值元素的和,如果不为对角线,再加上self-responsibility。
再来看第12~第14行,对角线的计算方法不同。所以矩阵中每个元素与0比较取较大值,得到仅是一个正值的矩阵,但是对角线的元素保持不变。随后对每一列求和。

假设k=1,a(i=1:5,1)= 1 2 3 4 5
(1)当i=1时,i=k 按第一个公式计算。
a(1,1)=a(1,1)+a(2,1)+a(3,1)+a(4,1)+a(5,1) - a(1,1) 而代码13行做的就是这件事。所以最终a矩阵对角线上的元素即为代码13行计算出的A矩阵的对角线上的元素,因此14行对其进行了存储。

(2)当i=2时, ik ,此时按公式2计算。
代码sum(Rp,1) 相当于 ikmax[0,r(i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值