如何編寫求K-均值聚類演算法的Matlab程式?
在聚類分析中,K-均值聚類演算法(k-means algorithm)是無監督分類中的一種基本方法,其也稱為C-均值演算法,其基本思想是:通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。
假設要把樣本集分為c個類別,演算法如下:
(1)適當選擇c個類的初始中心;
(2)在第k次迭代中,對任意一個樣本,求其到c箇中心的距離,將該樣本歸到距離最短的中心所在的類,
(3)利用均值等方法更新該類的中心值;
(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。
下面介紹作者編寫的一個分兩類的程式,可以把其作為函式呼叫。
%% function [samp1,samp2]=kmeans(samp); 作為呼叫函式時去掉註釋符
samp=[11.1506 6.7222 2.3139 5.9018 11.0827 5.7459 13.2174 13.8243 4.8005 0.9370 12.3576]; %樣本集
[l0 l]=size(samp);
%%利用均值把樣本分為兩類,再將每類的均值作為聚類中心
th0=mean(samp);
n1=0;n2=0;
c1=0.0;
c1=double(c1);
c2=c1;
for i=1:l
if samp(i)<th0
c1=c1+samp(i);n1=n1+1;
else
c2=c2+samp(i);n2=n2+1;
end
end
c1=c1/n1;c2=c2/n2; %初始聚類中心
t=0;
cl1=c1;cl2=c2;
c11=c1;c22=c2; %聚類中心
while t==0
samp1=zeros(1,l);
samp2=samp1;
n1=1;n2=1;
for i=1:l
if abs(samp(i)-c11)<abs(samp(i)-c22)
samp1(n1)=samp(i);
cl1=cl1+samp(i);n1=n1+1;
c11=cl1/n1;
else
samp2(n2)=samp(i);
cl2=cl2+samp(i);n2=n2+1;
c22=cl2/n2;
end
end
if c11==c1 && c22==c2
t=1;
end
cl1=c11;cl2=c22;
c1=c11;c2=c22;
end %samp1,samp2為聚類的結果。
初始中心值這裡採用均值的辦法,也可以根據問題的性質,用經驗的方法來確定,或者將樣本集隨機分成c類,計算每類的均值。
k-均值演算法需要事先知道分類的數量,這是其不足之處。