K-means聚类属于一种动态聚类方法。下面我直接给出算法框架和实验例程。
先给出实验用的数据集,有二维数据和三维数据,其他维的数据依次类推。
二维数据DATA2=[0 0;0 1;1 0;1 1;2 1;1 2;2 2;3 2;6 6;6 7;7 6;7 7;7 8;8 6;8 7;8 8;8 9;9 7;9 8;9 9],DATA3=[0 0 0;0 1 1;1 0 1;1 1 2;2 1 1;1 2 3;2 2 4;3 2 1;6 6 7;6 7 2;7 6 6;7 7 8;7 8 9;8 6 7;8 7 6;8 8 8;8 9 5;9 7 7;9 8 9;9 9 5];画出其二维和三维视图如下
下面给出算法框架
下面是程序和实验结果
<span style="font-family:Times New Roman;">% K-means Algorithm data=[0 0;0 1;1 0;1 1;2 1;1 2;2 2;3 2;6 6;6 7;7 6;7 7;7 8;8 6;8 7;8 8;8 9;9 7;9 8;9 9]; [m n]=size(data); k=2; plotstyle = {'b.', 'r+', 'g', 'k', 'b--', 'r--'}; z=zeros(k,n); d=zeros(k,m); z(1:k,:)=data(1:k,:); for j=1:99 for i=1:k a=repmat(z(i,:),m,1); d(i,:)=sum(((a-data).^2)'); end temp=sum(sum(z)); [nn kk]=min(d,[],1); for i=1:k S=data(find(kk==i),:); z(i,:)=mean(S); end temp1=sum(sum(z)); if temp==temp1 break; end end for i=1:k a=repmat(z(i,:),m,1); d(i,:)=sum(((a-data).^2)'); end [nn kk]=min(d,[],1); for i=1:k S=data(find(kk==i),:); [ii jj]=size(S); a=repmat(z(i,:),ii,1); d=sum(((a-S).^2)'); [p q]=max(d); R=p; scatter(S(:,1),S(:,2),char(plotstyle(i))); hold on alpha=0:pi/50:2*pi;%角度[0,2*pi] x=(2*R/3)*cos(alpha)+z(i,1); y=(2*R/3)*sin(alpha)+z(i,2); plot(x,y,'-'); hold on axis equal end</span>
下面是用K-means算法得到的聚类效果
k=3,n=2
k=6,n=2
k=3,n=3
k=6,n=3