续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现

上一篇博文中介绍了聚类算法中的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实现代码如下:


  1 clc;

  2 clear;

  3 

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

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

  6 

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

  8 

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

 10 p=randperm(len);

 11 Temp=p(1:k);

 12 Center=zeros(1,k);

 13 for i=1:k

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

 15 end

 16 

 17 

 18 

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

 20 TempDistance=zeros(len,3);

 21  while 1

 22     

 23     Circulm=1;

 24     

 25     p1=1;

 26     p2=1;

 27     p3=1;

 28     

 29     JudgeEqual=zeros(1,k);

 30     if(Circulm~=1)

 31         clear Group1 Group2 Group3;   

 32     end

 33     for i=1:len

 34         for j=1:3

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

 36         end

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

 38         if(RowIndex==1)

 39             Group1(p1)=ClomStatic(i);

 40             p1=p1+1;

 41         elseif(RowIndex==2)

 42             Group2(p2)=ClomStatic(i);

 43             p2=p2+1;

 44         elseif(RowIndex==3)

 45             Group3(p3)=ClomStatic(i);

 46             p3=p3+1;

 47         end

 48     end

 49      

 50         len1=length(Group1);

 51         len2=length(Group2);

 52         len3=length(Group3);

 53         

 54         

 55         %计算Group1,Group2,Group3的均值

 56         MeanGroup1=mean(Group1);

 57         MeanGroup2=mean(Group2);

 58         MeanGroup3=mean(Group3);

 59 

 60               %分别计算每个类中除开类中心的点到其他所有点的距离和E,E最小时为该类新的聚类中心.

 61               E=zeros(1,len1-1);

 62               q1=1;

 63               for j=1:len1

 64                   for i=1:len

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

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

 67                         q1=q1+1;

 68                     end

 69                   end

 70               end

 71               NewCenter(1)=min(E);

 72               

 73              E=zeros(1,len2-1);

 74               q2=1;

 75               for j=1:len2

 76                   for i=1:len

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

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

 79                         q2=q2+1;

 80                     end

 81                   end

 82               end

 83               NewCenter(2)=min(E);

 84               

 85               E=zeros(1,len3-1);

 86               q3=1;

 87               for j=1:len3

 88                   for i=1:len

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

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

 91                         q3=q3+1;

 92                     end

 93                   end

 94               end

 95               NewCenter(3)=min(E);

 96         

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

 98         JudgeEqual=zeros(1,k);

 99         for i=1:k

100             JudgeEqual=(NewCenter==Center);

101         end

102         

103         S=0;

104         for i=1:k

105             if(JudgeEqual(i)==1)

106                 S=S+1;

107             end

108         end

109         

110         if(S==3)

111             break;

112         end

113         

114         Circulm=Circulm+1;

115   end

结果如下:






 

你可能感兴趣的:(数据挖掘)