K均值聚类(Kmeans)

模式识别 作业五

Sigma = [1, 0; 0, 1];
mu1 = [1, -1];
x1 = mvnrnd(mu1, Sigma, 200);
mu2 = [5.5, -4.5];
x2 = mvnrnd(mu2, Sigma, 200);
mu3 = [1, 4];
x3 = mvnrnd(mu3, Sigma, 200);
mu4 = [6, 4.5];
x4 = mvnrnd(mu4, Sigma, 200);
mu5 = [9, 0.0];
x5 = mvnrnd(mu5, Sigma, 200);
% obtain the 1000 data points to be clustered
X = [x1; x2; x3; x4; x5];
% Show the data point
plot(x1(:,1), x1(:,2), 'r.'); hold on;
plot(x2(:,1), x2(:,2), 'b.');
plot(x3(:,1), x3(:,2), 'k.');
plot(x4(:,1), x4(:,2), 'g.');
plot(x5(:,1), x5(:,2), 'm.');
save myX  %将X存储到文件中,在其他文件中load就可以了


结果如下:

K均值聚类(Kmeans)_第1张图片


% 初始聚类中心
mu0=[X(1,:); X(205,:);X(405,:);X(605,:);X(805,:)];
mu1=zeros(5,c);
lable=zeros(r,1);
% first cluster
    dist=zeros(5,1);
    for k=1:r
        for n=1:5
            dist(n)=norm(X(k,:)-mu0(n,:));
        end
        lable(k)=find(dist==min(dist));
    end    

%     X1=[lable X];
    sum=zeros(5,2);
    count=zeros(5,1);
    
 % 第一次聚类
    for n=1:5    
        for k=1:r
            if lable(k)==n 
             sum(n,:)=sum(n,:)+X(k,:);
             count(n)=count(n)+1;
            end   
        end   
        mu1(n,:)=sum(n,:)/count(n);
    end

 % square error  
    e=zeros(5,1);
    esum=0;
    for n=1:5
        for k=1:r
            if lable(k)==n
                 e(n,:)=e(n,:)+norm(X(k,:)-mu1(n,:));
            end
        end
        esum=esum+e(n,:);
    end

% ***************** start Iteration **************

countNotX=0;% 到达一定值后,停止迭代
s=0;
count1=zeros(5,1);
while true
    s=s+1;
%random choose X to update  
    ran=round(1+999*rand(1));%总共1000个样本
    Xrand=X(ran,:);
    rou=zeros(5,1);
    rouMin=inf;
    newClassLable=0;
    if count(lable(ran))~=0
        for n=1:5
            if lable(ran)==n
                rou(n)=norm(Xrand-mu1(n,:))*count(n)/(count(n)-1);
            else
                rou(n)=norm(Xrand-mu1(n,:))*count(n)/(count(n)+1);
            end
            if rou(n)<=rouMin;
                rouMin=rou(n);
                newClassLable=n;
            end
        end
       if rouMin<rou(lable(ran))          
            countNotX=0;
%              new mu  这里用课件中的公式,不知道哪里错了,总是不行,就用最蠢的办法了
           for n=1:5    
                for k=1:r
                    if lable(k)==n 
                     sum(n,:)=sum(n,:)+X(k,:);
                     count1(n)=count1(n)+1;
                    end   
                end   
                mu1(n,:)=sum(n,:)/count1(n);
           end
%             new count
            count(lable(ran))=count(lable(ran))-1;
            count(newClassLable)=count(newClassLable)+1;
%           new esum
            e(lable(ran),:)=e(lable(ran),:)-rou(lable(ran));
            e(newClassLable,:)=e(newClassLable,:)+rouMin;
             esum=esum+rouMin-rou(lable(ran));  
             lable(ran)=newClassLable ;
         else
%            disp('No')
           countNotX= countNotX+1;
           if countNotX==600
               %when J is not changed for 600 times,reckon OK
               break
           end
       end
    end
end











你可能感兴趣的:(K均值聚类(Kmeans))