【发布时间】:2014-01-24 22:43:16
【问题描述】:
我正在尝试在 C++ 中实现 Affinity Propagation 聚类算法。作为测试的一部分,我想将我的结果与 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 中它们是默认值。由于我对 Affinity Propagation 的 R 更满意,因此出于比较原因,我坚持使用 Matlab 的默认值,以避免无意中搞砸。
..但是得到了:
>> idx'
ans =
3 3 3 3 5 9 9 9 9 5
在这两种情况下,相似度矩阵都匹配。我可能错过了什么?
更新:
我还实现了 Frey & Dueck 在其原始出版物中提出的 Matlab 代码。 (您可能会注意到我省略了噪音)并且虽然我可以复制以前的 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
【问题讨论】:
-
看起来您在 R 中指定的参数比在 Matlab 中更多。您可以发送包含最大迭代次数等参数的 matlab 函数和选项参数吗?只是为了确保它们在完全相同的条件下运行。
-
这个问题似乎是题外话,因为它是关于统计数据而不是代码,应该移到 stats.stackexchange.com
-
(编辑后给出matlab的参数)
-
@ManosIkonomakis 但这些参数如何传递给
apcluster? -
更新了新信息。 @Dan 我希望我已经回答了你的问题。
标签: r matlab cluster-analysis