kmeans聚類演算法matlab實現

ybyly發表於2014-12-08

執行介面(可以支援任意維資料)



單介紹下kmeans演算法流程:

假設要把樣本集分為c個類別,演算法描述如下:
(1)適當選擇c個類的初始中心;
(2)在第k次迭代中,對任意一個樣本,求其到c各中心的距離,將該樣本歸到距離最短的中心所在的類;
(3)利用均值等方法更新該類的中心值;
(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。
演算法的最大優勢在於簡潔和快速。演算法的關鍵在於初始中心的選擇和距離公式。
matlab實現:
function [ class count]=k_means(data,k);

%clear
%load testdata.mat
%k=2;
sum=size(data,1);
for i=1:k
  centroid(i,:)=data(floor(sum/k)*(i-1)+1,:);
end
tic
ck=0;
while 1
    temp=zeros(1,2);;
    count=zeros(1,k);
    ck=ck+1
    for i=1:sum
        for j=1:k
            dist(j)=norm(data(i,:)-centroid(j,:));
        end
            [a min_dist]=min(dist);
            count(min_dist)=count(min_dist)+1;
            class(min_dist,count(min_dist))=i;
    end
    
  %重新計算類中心    
    for i=1:k   
        for j=1:count(i)
            temp=temp+data(class(i,j),:);
        end
        temp_centroid(i,:)=temp/(count(i));
        temp(1,:)=0;
      % temp_centroid(i,:)=re_calculate(class(i,:),count(i),tdata);
    end  
    %計算新的類中心和原類中心距離centr_dist;
    for i=1:k
        centr_dist(i)=norm(temp_centroid(i,:)-centroid(i,:));
    end
    if max(centr_dist)<=0
        break;
    else
        for i=1:k
            centroid(i,:)=temp_centroid(i,:);
            %重新進行前倆不
        end
    end 
end
toc
    

資料點是滑鼠插進去的,通過介面可以很清晰的看到分類過程,功能截圖如下:


相關文章