• 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就可以了


    结果如下:



     1 % 初始聚类中心
     2 mu0=[X(1,:); X(205,:);X(405,:);X(605,:);X(805,:)];
     3 mu1=zeros(5,c);
     4 lable=zeros(r,1);
     5 % first cluster
     6     dist=zeros(5,1);
     7     for k=1:r
     8         for n=1:5
     9             dist(n)=norm(X(k,:)-mu0(n,:));
    10         end
    11         lable(k)=find(dist==min(dist));
    12     end    
    13 
    14 %     X1=[lable X];
    15     sum=zeros(5,2);
    16     count=zeros(5,1);
    17     
    18  % 第一次聚类
    19     for n=1:5    
    20         for k=1:r
    21             if lable(k)==n 
    22              sum(n,:)=sum(n,:)+X(k,:);
    23              count(n)=count(n)+1;
    24             end   
    25         end   
    26         mu1(n,:)=sum(n,:)/count(n);
    27     end
    28 
    29  % square error  
    30     e=zeros(5,1);
    31     esum=0;
    32     for n=1:5
    33         for k=1:r
    34             if lable(k)==n
    35                  e(n,:)=e(n,:)+norm(X(k,:)-mu1(n,:));
    36             end
    37         end
    38         esum=esum+e(n,:);
    39     end
    40 
    41 % ***************** start Iteration **************
    42 
    43 countNotX=0;% 到达一定值后,停止迭代
    44 s=0;
    45 count1=zeros(5,1);
    46 while true
    47     s=s+1;
    48 %random choose X to update  
    49     ran=round(1+999*rand(1));%总共1000个样本
    50     Xrand=X(ran,:);
    51     rou=zeros(5,1);
    52     rouMin=inf;
    53     newClassLable=0;
    54     if count(lable(ran))~=0
    55         for n=1:5
    56             if lable(ran)==n
    57                 rou(n)=norm(Xrand-mu1(n,:))*count(n)/(count(n)-1);
    58             else
    59                 rou(n)=norm(Xrand-mu1(n,:))*count(n)/(count(n)+1);
    60             end
    61             if rou(n)<=rouMin;
    62                 rouMin=rou(n);
    63                 newClassLable=n;
    64             end
    65         end
    66        if rouMin<rou(lable(ran))          
    67             countNotX=0;
    68 %              new mu  这里用课件中的公式,不知道哪里错了,总是不行,就用最蠢的办法了
    69            for n=1:5    
    70                 for k=1:r
    71                     if lable(k)==n 
    72                      sum(n,:)=sum(n,:)+X(k,:);
    73                      count1(n)=count1(n)+1;
    74                     end   
    75                 end   
    76                 mu1(n,:)=sum(n,:)/count1(n);
    77            end
    78 %             new count
    79             count(lable(ran))=count(lable(ran))-1;
    80             count(newClassLable)=count(newClassLable)+1;
    81 %           new esum
    82             e(lable(ran),:)=e(lable(ran),:)-rou(lable(ran));
    83             e(newClassLable,:)=e(newClassLable,:)+rouMin;
    84              esum=esum+rouMin-rou(lable(ran));  
    85              lable(ran)=newClassLable ;
    86          else
    87 %            disp('No')
    88            countNotX= countNotX+1;
    89            if countNotX==600
    90                %when J is not changed for 600 times,reckon OK
    91                break
    92            end
    93        end
    94     end
    95 end










  • 相关阅读:
    IIS 禁止自动回收
    误删除系统帐户且SA被禁用,如何修复?单用户模式登录可解决。
    不到100行代码实现SHELL环境下图形化的IP设置功能
    2021总结
    快排
    Windows 10 修改用户名及Users文件夹
    DATUM支持不同格式(JSON,CSV,SQL,XML等)的在线模拟数据生成器
    记:云服务器被暴破感染bioset
    前端项目修改npm/yarn配置文件来加速包下载
    十个前端常见手写功能
  • 原文地址:https://www.cnblogs.com/xy123001/p/5218656.html
Copyright © 2020-2023  润新知