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));%正确率