標籤:kmediod pam 聚類 kmeans
上一篇博文中介紹了聚類演算法中的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
結果如下:
轉載請註明作者:小劉
續前篇---資料採礦之聚類演算法k-mediod(PAM)原理及實現