预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

clear clc loaddata.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,:); z2=train(45,:); z3=train(90,:);%初始聚类中心z1,z2,z3 m=0;t=0;%迭代步数 whilem==0 samp1=[];samp2=[];samp3=[];%定义空样本:第一类为samp1,第二类为samp2,第三类为samp3 n1=1;n2=1;n3=1; t=t+1; fori=1:90 if(pdist([train(i,:);z1])<pdist([train(i,:);z2]))&&(pdist([train(i,:);z1])<pdist([train(i,:);z3]))%距离 %若训练样本与聚类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);%求出新的均值,产生新的聚类中心 ifisequal(c1,z1)&&isequal(c2,z2)&&isequal(c3,z3)%判断新旧聚类中心是否相等。若相等则结束m=1 m=1; end z1=c1;%新旧聚类中心若不相等,新聚类中心赋值于旧聚类中心。继续循环 z2=c2; z3=c3; end%while %%聚类中心z1=[5.02673.451.47330.24667],z2=[5.97032.74594.44051.4676],z3=[6.93.04785.81742.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; forx=1:u d1=pdist([test(x,:);z1]);%测试样本与聚类中心z1的距离 d2=pdist([test(x,:);z2]);%测试样本与聚类中心z2的距离 d3=pdist([test(x,:);z3]);%测试样本与聚类中心z3的距离 ifd1<d2&&d1<d3%若d1最小则测试样本赋值于test1 test1(m1,:)=test(x,:); m1=m1+1;m=1; elseifd2<d1&&d2<d3%若d2最小则测试样本赋值于test2 test2(m2,:)=test(x,:); m2=m2+1;m=2; elsetest3(m3,:)=test(x,:);%若d3最小则测试样本赋值于test3 m3=m3+1;m=3; end%分类结果为test1(20*4),test2(25*4),test3(15*4)共60组 ifx<=20 disp(sprintf('第%d组数据分类后为第%d类',x+30,m)); elseifx>20&&x<=40 disp(sprintf('第%d组数据分类后为第%d类',x+60,m)); elseifx>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));%正确