Kmeans算法的实现二

load data.txt; 
a=data(1:30,1:4);%取第一类的前三十组
aa=data(31:50,1:4);%第一类的后二十组
b=data(51:80,1:4);%第二类的前三十组
bb=data(81:100,1:4);%第二类的后二十组
c=data(101:130,1:4);%取第三类的前三十组
cc=data(131:150,1:4); %第三类的后二十组
train=cat(1,a,b,c);%组成训练样本(90*4)
test=cat(1,aa,bb,cc);%组成测试样本(60*4)
c=3;%c均值c=3
z1=train(1,:);  %取第1行,作为1中心
z2=train(45,:);%取第45行,作为2中心
z3=train(90,:);   %取第90行,作为3中心,初始聚类中心z1,z2,z3
m=0;t=0;%迭代步数
while m==0
   samp1=[];samp2=[];samp3=[];  %定义空样本:第一类为samp1,第二类为samp2,第三类为samp3
   n1=1;n2=1;n3=1;
   t=t+1;
   for i=1:90
       if (pdist([train(i,:);z1])<pdist([train(i,:);z2]))&&(pdist([train(i,:);z1])<pdist([train(i,:);z3]))%距离
           %pdist(X)行行距离
           %若训练样本与聚类z1的距离小于与z2,z3的距离,则赋值于samp1.
            samp1(n1,:)=train(i,:);
            n1=n1+1;
       elseif (pdist([train(i,:);z2])<pdist([train(i,:);z1]))&&(pdist([train(i,:);z2])<pdist([train(i,:);z3]))
           %若训练样本与聚类z2的距离小于与z1,z3的距离,则赋值于samp2.
            samp2(n2,:)=train(i,:);
            n2=n2+1;
       else%其他则赋值于samp3
            samp3(n3,:)=train(i,:);
            n3=n3+1;
       end
   end %for
   c1=mean(samp1,1);
    c2=mean(samp2,1);
    c3=mean(samp3,1);   %求出新的均值,产生新的聚类中心
  if isequal(c1,z1)&&isequal(c2,z2)&&isequal(c3,z3)   %判断新旧聚类中心是否相等。若相等则结束m=1
    m=1;    
  end
   z1=c1;  %新旧聚类中心若不相等,新聚类中心赋值于旧聚类中心。继续循环
  z2=c2;
  z3=c3;
end %while  
%%聚类中心z1=[5.0267 3.45 1.4733 0.24667],z2=[5.9703 2.7459 4.44051.4676],z3=[6.9 3.0478 5.8174 2.0217]
%%kmeans算法结束后分三类samp1(30*4),samp2(37*4),samp3(23*4)共90行,迭代次数t=5
sum=0;
[u,v]=size(test);%返回测试样本行列,u=60,v=4
test1=[];test2=[];test3=[];m1=1;m2=1;m3=1;
for x=1:u
    d1=pdist([test(x,:);z1]);%测试样本与聚类中心z1的距离
    d2=pdist([test(x,:);z2]);%测试样本与聚类中心z2的距离
    d3=pdist([test(x,:);z3]);%测试样本与聚类中心z3的距离
    if d1<d2&&d1<d3%若d1最小则测试样本赋值于test1
        test1(m1,:)=test(x,:);
        m1=m1+1;m=1;
    elseif d2<d1&&d2<d3%若d2最小则测试样本赋值于test2
        test2(m2,:)=test(x,:);
        m2=m2+1;m=2;
    else test3(m3,:)=test(x,:);%若d3最小则测试样本赋值于test3
        m3=m3+1;m=3;
    end%分类结果为test1(20*4),test2(25*4),test3(15*4)共60组
     if x<=20 
   disp(sprintf('第%d组数据分类后为第%d类',x+30,m)); 
   elseif x>20&&x<=40
   disp(sprintf('第%d组数据分类后为第%d类',x+60,m)); 
   elseif x>40&&x<=60
   disp(sprintf('第%d组数据分类后为第%d类',x+90,m)); 
   end 
   if (x<=20&&m==1)||(x>20&&x<=40&&m==2)||(x>40&&x<=60&&m==3) 
       sum=sum+1; %正确的个数
   end 
 end 
disp(sprintf('分类正确率为%4.2f',sum/60));%正确率

你可能感兴趣的:(Kmeans算法的实现二)