AP聚类以及matlab实现

kmeans聚类以及fcm聚类的一大局限是需要提前知道大致的聚类个数,现实中使用比较受限,2007年,Frey和Dueck在Science发表了《Clustering by Passing Messages Between Data Points》,提出了AP聚类的方法,此方法采用点点之间交换信息的方式聚类,下面对此算法进行分析并且用matlab实现之。

1.算法原理

首先我们定义三个矩阵:

1.相似度矩阵s(i,k):表示数据点k作为数据点i的聚类中心的能力(相当于k是参选人,i是选民),可以用欧氏距离来表示。

2.吸引度矩阵r(i,k):表示普通数据点传送到临时聚类中心k的信息,表示k适合作为数据点i的聚类中心的程度。

3.归属度矩阵a(i,k):表示k传送到i的信息,表示i选择k作为其数据点的合适程度

初始a(i,k)=0,接下来,r(i,k)采用下面规则更新:

r(i,k)=s(i,k)-max{a(i,k’)+s(i,k’)}(k’ s.t k’≠k)

解释:两个点i和k的吸引度是一个相对的概念,我们只需要找到最大的i和k‘的认可程度(a(i,k’)+s(i,k’)),再用s(i,k)与他相减就可以得到k对于i的吸引度了。

a(i,k)采用下面规则更新:

a(i,k)=min{0,r(k,k)+∑max{0,r(i’,k)}

解释:如果k作为其他点i’的聚类中心的合适度很大,那么节点k作为i的聚类中心的何时也可能会较大由此可以先计算出k对于其他节点的适应度(r(i’,k)),然后累加

a(k,k)=∑max{0,r(i’,k)}

解释:即点k在这些吸引度大于0的数据点的支持下,数据点i选择k作为其聚类中心的累计证明。

对于点i,计算a(i,k)+r(i,k)取最大值的k值,如果k=i时,则i作为一个聚类中心,否则确定k是点i的聚类中心,与kmeans算法类似,当聚类中心的值不再变动时认为聚类成功。

伪代码:

​ 1) 初始s,r,a矩阵

​ 2) 更新r,a矩阵

​ 3) 重复12直到达到迭代上限或是误差小于给定值

算法图如下:
在这里插入图片描述

2. 代码展示
colorp={'g.','r.','c.','m.','y.','k.'};
color={'g','r','c','m','y','k'};
point={'+','o','*','x','square','diamond'};
n=length(X);
S=zeros(n,n);
%初始化吸引度矩阵s
for i = 1:n
    for j =1:n
        S(i,j)=norm([X(1,i),X(2,i)]-[X(1,j),X(2,j)]);
    end
end

N=size(S,1);A=zeros(N,N);R=zeros(N,N); %初始化矩阵
S=S+1e-12*randn(N,N)*(max(S(:))-min(S(:)));
lam=0.5;
for iter = 1:100
    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;
    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;
end
E=R+A;
I=find(diag(E)>0);K=length(I);
[tem,c] = max(S(:,I),[],2); c(I)=1:K; idx=I(c);


%画图
u=unique(idx);
for i = 1:length(u)
    t=idx==u(i);
    plot(X(1,t),X(2,t),colorp{i});
    hold on;
end
3. 结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考文献:[2007] Clustering by Passing Messages Between Data Points BrendanJ.Frey*andDelbertDueck

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
AP聚类算法Matlab实现可以参考Frey和Dueck在科学杂志上发表的研究《Clustering by Passing Messages Between Data Points》。该算法使用点对点之间交换信息的方式来聚类数据。具体的实现步骤如下: 1. 初始化相似性矩阵S,其中S(i,j)表示数据点i与数据点j之间的相似性。 2. 初始化责任矩阵R和可用性矩阵A,其中R(i,j)表示数据点i选择数据点j作为其examplar的责任程度,A(i,j)表示数据点i被数据点j选择为其examplar的可用程度。 3. 迭代更新责任矩阵R和可用性矩阵A,直到收敛。更新规则如下: - 更新责任矩阵R:R(i,j) = S(i,j) - max{A(i,k) + S(i,k)},其中k != j。 - 更新可用性矩阵A:A(i,j) = min{0, R(j,j) + sum[max{0, R(k,j)},其中k != i。 4. 根据最终的可用性矩阵A确定每个数据点的examplar。 5. 根据examplar确定每个数据点的聚类。 以上是AP聚类算法的基本步骤,具体的Matlab实现细节可以参考相关的研究论文和代码示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [AP聚类算法(Affinity propagation Clustering Algorithm )](https://blog.csdn.net/weixin_39974409/article/details/116146959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [AP聚类以及matlab实现](https://blog.csdn.net/Rorschach321/article/details/106552546)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现](https://blog.csdn.net/weixin_30396699/article/details/97529877)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值