亲和力传播结果不匹配

时间:2014-01-07 09:48:24

标签: r matlab cluster-analysis

我正在尝试在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

1 个答案:

答案 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