K_means聚類,利用matlab實現對一維數據的聚類


 

 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
   
          
          
          

 
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM