kmeans的实现

function [Y,y]=kmeans(m,k,isRand)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%kMeansCluster-Simple k-means clustering algorithm
%Input:
%m-required,maxtrix data
%k-number of groups
%isRand -optional,if using random initialzation isRand=1,otherwise input
%any number(default),it will assign the first k data as initial centriods.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


if nargin<3
    isRand=0;
end
if nargin<2
    k=1;
end


[maxRow,maxCol]=size(m);
Y=zeros(k,maxCol);


if maxRow<=k
    y=[m,1:maxRow]
end


%initial the values of centoid
if isRand
    p=randperm(size(m,1));
    for i=1:k
        c(i,:)=m(p(i),:);
    end
else
    for i=1:k
        c(i,:)=m(i,:);
    end
end


temp=zeros(maxRow,1);  %initial as zero vector


while 1
    d=EuclideanDistance(m,c); %calculate objects-centrid distances
    [z,g]=min(d,[],2); %find group maxtix g
    if g==temp              
        break;         %stop the interation
    else
        temp=g;        %copy graup maxtrix to temporary variable
    end
    for i=1:k
        f=find(g==i);
        if f            %only compute centroid if it is not emmpty
            c(i,:)=mean(m(find(g==i),:),1);
        end
    end
end
Y=c;
y=[m,g];


end

你可能感兴趣的:(clustering)