K_means算法的具體過程
1、從數據集{X} 中任意選取k個賦給初始的聚類中心c1, c2, …, ck;
2、對數據集中的每個樣本點xi,計算其與各個聚類中心cj的歐氏距離並獲取其類別標號:
3、按下式重新計算k個聚類中心;
4、重復步驟2和步驟3,直到達到最大迭代次數、聚類目標函數達到最優值或者兩次迭代得到的目標函數變化小於給定的較小值為止
將令k=5聚類的結果如下

%行5000,列22的數據以矩陣形式保存 M=dlmread('waveform.txt',','); [m,n]=size(M); %隨機的選取矩陣中的k個元素作為聚類中心 k=5; c=zeros(1,k); for i=1:k c(1,i)=M(round(rand()*5000)+1,round(rand()*22)+1); end %獲取每個樣本到聚類中心的距離 label_u=zeros(m,n); maxgn=60; label=zeros(m,n); mindis=20; iter=1; while(iter<maxgn) for i=1:m for j=1:n for t=1:k dis=(M(i,j)-c(1,t))^2; if(dis<mindis || label(i,j)==0) label(i,j)=t; mindis=dis; label_u(i,j)=t; end end end end for t=1:k sum=0; new_u=0; for i=1:m for j=1:n if(label_u(i,j)==t) sum=sum+1; new_u=new_u+M(i,j); end end end c(1,t)=new_u/(sum+eps); end iter=iter+1; end for i=1:m for j=1:n if(label_u(i,j)==1) plot(M(i,j),1,'r+') hold on; else if(label_u(i,j)==2) plot(M(i,j),1,'b*') hold on; else if(label_u(i,j)==3) plot(M(i,j),1,'g*') hold on; else if(label_u(i,j)==4) plot(M(i,j),1,'y*') hold on; else if(label_u(i,j)==5) plot(M(i,j),1,'k*') hold on; end end end end end end end