数据挖掘pam算法c语言实现,续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现...

本文介绍了KMedoids算法,它是KMeans的一种改进,对噪声和孤立点不敏感。KMedoids在聚类中心更新时,选择每个类中到其他点距离之和最小的点作为新中心,从而优化聚类效果。然而,这种优化带来了更高的计算复杂度,导致处理大规模数据时效率降低。文章还提供了KMedoids的Matlab实现代码,展示了算法的具体步骤。
摘要由CSDN通过智能技术生成

上一篇博文中介绍了聚类算法中的kmeans算法.无可非议kmeans因为其算法简单加之分类效率较高。已经广泛应用于聚类应用中.

然而kmeans并不是十全十美的.其对于数据中的噪声和孤立点的聚类带来的误差也是让人头疼的.

于是一种基于Kmeans的改进算法kmediod应运而生.kmediod和Kmeans算法核心思想大同小异,可是最大的不同是在修正聚类中心的时候,kmediod是计算类簇中除开聚类中心的每点到其它全部点的聚类的最小值来优化新的聚类中心.正是这一区别使得kmediod弥补了kmeans算法的缺点.kmediod对噪声和孤立点不敏感.可是事情都具有两面性.这样的聚类准确性的提高是牺牲聚类时间来实现的.不难看出.kmediod须要不断的找出每一个点到其它全部点的距离的最小值来修正聚类中心,这大大加大了聚类收敛的时间.全部Kmediod对于大规模数据聚类就显得力不从心,仅仅能适应较小规模的数值聚类.

接下来我再对kmediod的算法描写叙述一遍:

1.设样本为X{x(1),x(2)........}

2.首先在样本中随机选取k个聚类中心.

3.然后对除开聚类中心外的样本点计算到每一个聚类中心的距离.将样本归类到距离样本中心近期的样本点.这便实现了最初的聚类

4.再对每一个类中除类中心的点外的其它样本点计算到其它全部点的距离和的最小值.将该最小值点作为新的聚类中心便实现了一次聚类优化.

5.反复步骤四,直到两次聚类中心的位置不再变化,这便完毕了终于的聚类

注:步骤4正体现了kmeans和kmediod的核心差异

k-mediod的matlab实现代码例如以下:

clc;

clear;

ClomStatic=[1,2,3,25,26,27,53,54,55];

len=length(ClomStatic);%求向量ClomStatic的长度

k=3; %给定的类别数目

%产生三个随机整数,随机聚类中心

p=randperm(len);

Temp=p(1:k);

Center=zeros(1,k);

for i=1:k

Center(i)=ClomStatic(Temp(i));

end

%计算除聚类中心外的样本数据到聚类中心的距离,然后进行聚类

TempDistance=zeros(len,3);

while 1

Circulm=1;

p1=1;

p2=1;

p3=1;

JudgeEqual=zeros(1,k);

if(Circulm~=1)

clear Group1 Group2 Group3;

end

for i=1:len

for j=1:3

TempDistance(i,j)=abs(ClomStatic(i)-Center(j));

end

[RowMin RowIndex]=min(TempDistance(i,:));

if(RowIndex==1)

Group1(p1)=ClomStatic(i);

p1=p1+1;

elseif(RowIndex==2)

Group2(p2)=ClomStatic(i);

p2=p2+1;

elseif(RowIndex==3)

Group3(p3)=ClomStatic(i);

p3=p3+1;

end

end

len1=length(Group1);

len2=length(Group2);

len3=length(Group3);

%计算Group1,Group2,Group3的均值

MeanGroup1=mean(Group1);

MeanGroup2=mean(Group2);

MeanGroup3=mean(Group3);

%分别计算每一个类中除开类中心的点到其它全部点的距离和E,E最小时为该类新的聚类中心.

E=zeros(1,len1-1);

q1=1;

for j=1:len1

for i=1:len

if(Group1(j)~=Center(1)&&i~=j)

E(q1)=floor(abs(Group1(j)-ClomStatic(i)));

q1=q1+1;

end

end

end

NewCenter(1)=min(E);

E=zeros(1,len2-1);

q2=1;

for j=1:len2

for i=1:len

if(Group2(j)~=Center(2)&&i~=j)

E(q2)=floor(abs(Group2(j)-ClomStatic(i)));

q2=q2+1;

end

end

end

NewCenter(2)=min(E);

E=zeros(1,len3-1);

q3=1;

for j=1:len3

for i=1:len

if(Group3(j)~=Center(3)&&i~=j)

E(q3)=floor(abs(Group3(j)-ClomStatic(i)));

q3=q3+1;

end

end

end

NewCenter(3)=min(E);

%推断新的类和旧类的聚类中心是否不同,不同则继续聚类,否则聚类结束

JudgeEqual=zeros(1,k);

for i=1:k

JudgeEqual=(NewCenter==Center);

end

S=0;

for i=1:k

if(JudgeEqual(i)==1)

S=S+1;

end

end

if(S==3)

break;

end

Circulm=Circulm+1;

end

结果例如以下:

9ab90963ef08d7f8f2413e617a6bb3b5.png

2b0c5f569c0cba515098a58f676b098a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值