上一篇博文中介紹了聚類算法中的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
結果如下: