續前篇---數據挖掘之聚類算法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

結果如下:





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM