1. 程式人生 > >如何編寫求K-均值聚類演算法的Matlab程式?

如何編寫求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-均值演算法需要事先知道分類的數量,這是其不足之處。