AP聚类算法是之前科学杂志上的一个paper
之前都没有用过,今天研究了下,感觉这个东西很不错,可以用到很多地方。
http://wenku.baidu.com/view/705cd8dcd15abe23482f4de5.html
这个是网上最多的一个说明文档,说的很详细,大家可以看看
这里我就像说说自己的理解:
AP算法主要是两个东西比较重要:
Responsibility:R(i,k)用来描述点k适合作为数据点i的聚类中心的程度。
Availability:A(i,k)用来描述点i选择点k作为其聚类中心的适合程度。R其实就是用i和k的相似度减去k和其他点的相似度和Availability的和的最大值得到。
A就是K点的权重(这里我吧P理解为k点作为中心点的权重)和其他点对K的R的最大值后取最小值。
公式如下:
R(i,k)=S(i,k)-max{A(i,j)+S(i,j)}(j{1,2,……,N,但j≠k})
A(i,k)=min{0,R(k,k)+ (j{1,2,……,N,但j≠i且j≠k})
这里有一个A(k,k) = max(0, R(k,k))
这里大家计算的时候要注意后面J的取值范围。
P是i和k的相似度与i和其他店的similarity计算得到。
A是k的权重与k和除去i之后的其他店的关系计算得到。
这样大家会发现,初始化后,R如果变大。那么响应了A会变小。A变小后,反过来促使R继续变大。
从而达到一个稳定的值。
对角线上的值具有同样的特性。
这样AP算法就通过迭代,从而取最大的值的点作为分类的中心点,最后通过S去得到分类的结果。
Matlab的代码如下:
function [idx,netsim,i,unconverged,dpsim,expref]=apcluster(s,p,varargin);
% Handle arguments to function
if nargin<2 error('Too few input arguments');
else
maxits=500; convits=40; lam=0.5; plt=0; details=0; nonoise=0;
i=1;
while i<=length(varargin)
if strcmp(varargin{i},'plot')
plt=1; i=i+1;
elseif strcmp(varargin{i},'details')
details=1; i=i+1;
elseif strcmp(varargin{i},'sparse')
[idx,netsim,dpsim,expref]=apcluster_sparse(s,p,varargin{:});
return;
elseif strcmp(varargin{i},'nonoise')
nonoise=1; i=i+1;
elseif