欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

K均值聚类(Kmeans)

程序员文章站 2022-07-14 11:41:40
...
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 % 初始聚类中心
 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