我正在尝试在C ++中实现 Affinity Propagation clustering algorithm 。作为测试的一部分,我想在 Matlab (Link)和 R (package apcluster)中将我的结果与完善的算法实现进行比较。不幸的是,群集不同意。
更准确地说,(测试)数据集是:
0.9411760 0.9702140
0.9607826 0.9744693
0.9754896 0.9574479
0.9852929 0.9489372
0.9950962 0.9234050
1.0000000 0.8936175
1.0000000 0.8723408
0.9852929 0.8595747
1.0000000 0.8893622
1.0000000 0.9191497
在 R 我输入:
S<-negDistMat(data)
A<-apcluster(S,maxits=1000,convits=100, lam=0.9,q=0.5)
得到了:
> A@idx
2 2 2 5 5 9 9 9 9 5
2 2 2 5 5 9 9 9 9 5
在 Matlab 中我输入了:
[idx,netsim,dpsim,expref]=apcluster(S,diag(S));
从实现apcluster的apcluster.m文件(第77行):
maxits=1000; convits=100; lam=0.9; plt=0; details=0; nonoise=0;
这解释了R的参数,在Matlab中它们是默认值。由于我对关于亲和传播的R更加满意,出于比较的原因,我坚持使用Matlab的默认值,只是为了避免无意中搞乱。
..但得到了:
>> idx'
ans =
3 3 3 3 5 9 9 9 9 5
在两种情况下,相似性矩阵都匹配。我能错过什么?
更新:
我还实现了Frey&amp; amp;提出的Matlab代码。 Dueck在他们的原始出版物。 (您可能会注意到我省略了噪声)虽然我可以复制前Matlab实现提供的索引,但可用性和责任矩阵在某些值上有所不同。误差小于0.01,但这很重要。
他们的代码是:
function [idx,A,R]=frey(S);
N=size(S,1);
A=zeros(N,N);
R=zeros(N,N);
lam=0.9; % Set damping factor
for iter=1:122
% Compute responsibilities
Rold=R;
AS=A+S;
[Y,I]=max(AS,[],2);
for i=1:N
AS(i,I(i))=-realmax;
end;
[Y2,I2]=max(AS,[],2);
R=S-repmat(Y,[1,N]);
for i=1:N
R(i,I(i))=S(i,I(i))-Y2(i);
end;
R=(1-lam)*R+lam*Rold; % Dampen responsibilities
% Compute availabilities
Aold=A;
Rp=max(R,0);
for k=1:N
Rp(k,k)=R(k,k);
end;
A=repmat(sum(Rp,1),[N,1])-Rp;
dA=diag(A);
A=min(A,0);
for k=1:N
A(k,k)=dA(k);
end;
A=(1-lam)*A+lam*Aold; % Dampen availabilities
end;
E=R+A; % Pseudomarginals
I=find(diag(E)>0); K=length(I); % Indices of exemplars
[tmp c]=max(S(:,I),[],2); c(I)=1:K; idx=I(c); % Assignments
答案 0 :(得分:1)
我已经尝试了所有代码,问题是由您提供输入首选项的方式引起的。在第一种情况(R)中,指定q = 0.5。这意味着输入首选项p设置为非对角线相似度的中位数(在您的示例中,这是-0.05129912)。如果我运行Matlab代码如下(我使用Octave,但Matlab应该给出相同的结果),我得到:
octave:7> [idx,netsim,dpsim,expref]=apcluster(S,-0.05129912);
octave:8> idx'
ans =
2 2 2 5 5 9 9 9 9 5
这与R结果完全相同。如果我运行你的Matlab代码(diag(S)是第二个参数),如果我运行
apcluster(S, p=diag(S))
R中的(在两种情况下都将所有样本的输入首选项设置为0),在两种情况下都得到10个单样本簇。所以这两个结果再次匹配,但我无法恢复你的Matlab结果
3 3 3 3 5 9 9 9 9 5
我希望能够明确区别。
干杯,UBod