【问题标题】:Affinity Propagation results do not match亲和传播结果不匹配
【发布时间】: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


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-09-28
    • 2018-11-17
    • 1970-01-01
    • 2017-09-21
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2019-10-15
    相关资源
    最近更新 更多