云南大学数学与统计学实验教学中心实验报告一、实验目的能根据给出的训练集与测试集,用近邻法,k近邻法与剪辑近邻法, 重复剪辑近邻法给出测试集的分类结果并分别计算其错误率。
二、实验内容画出近邻法的程序框图,对给定的分别存放在文件“riply_trn.mat”和”riply_tst.mat”中的两类样本训练集250个测试集1000个,试用近邻法,k近邻法与剪辑近邻法, 重复剪辑近邻法给出测试集的分类结果并分别计算其错误率。
三、实验环境Windows XPMatlab6.5四、实验过程一、程序框图:二、实验相关代码:(1)最近邻法%计算错误率函数function [P]=ZQL_func(ys,yr)load riply_tst;yr=y;n=size(ys,2);t=0;for i=1:nif ys(i)-yr(i)==0t=t+1;endendP=1-t/n;%最近邻函数文件function [ypd]=ZJL_func(Xtr,ytr,Xts,yts)[m1,n1]=size(Xtr);[m2,n2]=size(Xts);d=zeros(1,n1);ypd=zeros(1,n2);for i=1:n2for j=1:n1d(j)=(Xts(1,i)-Xtr(1,j))^2+(Xts(2,i)-Xtr(2,j))^2; %欧式距离endmin=d(1);r=1;for t=2:n1if d(t)<=minmin=d(t); %计算最小距离(并保存下标值)r=t;endendypd(i)=ytr(r);end%最近邻的m文件load riply_trn;Xtr=X;ytr=y;load riply_tst;Xts=X;yts=y;[m,n]=size(Xts);yp=zeros(1,n);yp=ZJL_func(Xtr,ytr,Xts,yts);p=ZQL_func(yp,yts)(1)运行结果:(注:由于分类结果数据过于庞大在此不列出,只将错误率给出)p =0.1500(2)k近邻法% k近邻法函数文件function [P]= KJL(k)load riply_trn;Xtr=X;ytr=y;[m1,n1]=size(Xtr);load riply_tst;Xts=X;yts=y;[m2,n2]=size(Xts);d=zeros(1,n1);ypd=zeros(1,n2);for i=1:n2for j=1:n1d(j)=(Xts(1,i)-Xtr(1,j))^2+(Xts(2,i)-Xtr(2,j))^2;enda=0;b=0;for t=1:n1for r=t:n1if d(t)>=d(r)a=d(t);d(t)=d(r);d(r)=a;b=ytr(t);ytr(t)=ytr(r); %对距离进行排序ytr(r)=b;endendendp=0;q=0;for s=1:kif ytr(s)==1p=p+1;elseq=q+1; %寻找最近的k个来判断类别endendif p>qypd(i)=1;elseypd(i)=2;endendZQL_func(ypd,yts)%根据作图找使得错误率达到最小的k值k=25:120;k1=[44,54];P2=KJL(k);figure(1),plot(k,P2(:))hold onplot(k1,min(P2(:)),'*r')hold off得到图形如下:从图中可看出当k值在43附近能使得错误率达到最小,约为0.079。
(3)剪辑近邻法:%剪辑法函数文件:function [Xbz,ybz,n]=JJF_func(Xjs,yjs,Xxs,yxs)[mj,nj]=size(Xjs);[mx,nx]=size(Xxs);d=zeros(1,nj);k=1;i=1;r=0;min=0;n=0;while k<=nxfor j=1:njd(j)=(Xxs(1,i)-Xjs(1,j))^2+(Xxs(2,i)-Xjs(2,j))^2;endmin=d(1);for t=2:njif d(t)<=minmin=d(t);r=t;endendif yxs(i)-yjs(r)==0i=i+1;elsefor j=i:nxXxs(i)=Xxs(i+1); %剪辑(通过用后面的值覆盖前面的值来实现)yxs(i)=yxs(i+1);endn=nx-1;endk=k+1;endXbz=zeros(mx,n);ybz=zeros(1,n);for i=1:nXbz(:,i)=Xxs(:,i);ybz(i)=yxs(i);end%剪辑法m文件:load riply_trn;Xtr=X;ytr=y;[m1,n1]=size(Xtr);load riply_tst;Xts=X;yts=y;%训练集的分类比例为2:3Xjs1=zeros(m1,n1);yjs1=zeros(1,n1);Xxs1=zeros(m1,n1);yxs1=zeros(1,n1);k=1;t=1;s=0;for i=1:n1s=rand;if s<=0.4Xjs1(:,k)=Xtr(:,i); %划分样本yjs1(k)=ytr(i);k=k+1;elseXxs1(:,t)=Xtr(:,i);yxs1(t)=ytr(i);t=t+1;endendXjs=zeros(m1,k);yjs=zeros(1,k);Xxs=zeros(m1,t);yxs=zeros(1,t);for i=1:kXjs(:,i)=Xjs1(:,i);yjs(i)=yjs1(i);endfor i=1:tXxs(:,i)=Xxs1(:,i);yxs(i)=yxs1(i);end[Xbz,ybz]=JJF_func(Xjs,yjs,Xxs,yxs);ypd=ZJL_func(Xtr,ytr,Xts,yts); %调用最近邻函数文件来判断类别P=ZQL_func(ypd,yts)剪辑法所得结果:在将样本数据以2:3的比例进行“参考集”与“考试集”的划分,经过数次的重复运行(因为是随机分类故而多运行几次从而体现出规律来)后的到得最小错误率为:P = 0.0830;自己将划分比例进行了调整,发现在比例为4:5附近的时候错误率达到最小,为P =0.0770,而比例比这大或小的时候错误率均高于0.0770(4)重复剪辑法:%重复剪辑法函数文件:(把样本分为5类)function [X,Y,t]=CFJJ_func(Xtr,ytr)[m,n]=size(Xtr);x1=zeros(m,n);y1=zeros(1,n);x2=zeros(m,n);y2=zeros(1,n);x3=zeros(m,n);y3=zeros(1,n);x4=zeros(m,n);y4=zeros(1,n);x5=zeros(m,n);y5=zeros(1,n);t1=0;t2=0;t3=0;t4=0;t5=0;for i=1:nt=rand;if t<=0.1t1=t1+1;x1(:,t1)=Xtr(:,i);y1(t1)=ytr(i);elseif t<=0.3t2=t2+1;x2(:,t2)=Xtr(:,i);y2(t2)=ytr(i);elseif t<=0.5t3=t3+1;x3(:,t3)=Xtr(:,i);y3(t3)=ytr(i);elseif t<=0.6t4=t4+1;x4(:,t4)=Xtr(:,i);y4(t4)=ytr(i);elset5=t5+1;x5(:,t5)=Xtr(:,i);y5(t5)=ytr(i);endendx1=x1(:,1:t1);y1=y1(:,1:t1);x2=x2(:,1:t2);y2=y2(:,1:t2);x3=x3(:,1:t3);y3=y3(:,1:t3);x4=x4(:,1:t4);y4=y4(:,1:t4);x5=x5(:,1:t5);y5=y5(:,1:t5);X=[x1,x2,x3,x4,x5];Y=[y1,y2,y3,y4,y5];t=[t1,t2,t3,t4,t5];%重复剪辑法m文件:load riply_trn;Xtr=X;ytr=y;load riply_tst;Xts=X;yts=y;p=zeros(1,5);num=0;st=0;t=0;[m,n]=size(Xtr);[m1,n1]=size(Xts);[A,ys,t]=CFJJ_func(Xtr,ytr);st=sum(t);while st~=num %控制重复剪辑的结束语句(即样本不再被“剪”去)st=num;S=mat2cell(A,[m],[t]); %将样本划分为5个子集Y=mat2cell(ys,[1],[t]);for i=1:5if i+1>5c=mod(i+1,5);elsec=i+1;endif size(S{1,c},2)>0[S{1,i},Y{1,i},p(i)]=JJF_func(S{1,c},Y{1,c},S{1,i},Y{1,i});endendS=cell2mat(S); %将样本又归为一个集合Y=cell2mat(Y);[A,ys,t]=CFJJ_func(S,Y);num=sum(p);endG=[S;Y]ypd=ZJL_func(S,Y,Xts,yts);P=ZQL_func(ypd,yts)实验结果:自己将代码运行数次,分析规律得到一个错误率相对较低的时候剪辑剩下的样本集及其对应的类别为:(大约还剩下28个样本时候错分的概率最小)G =0.0976 -0.8415 -0.1913 -0.6803 0.7577 0.6591 0.3727 0.4667 0.77710.7771 0.6719 -0.1913 -0.6803 0.7577 0.6591 -0.5541 -0.3665 0.06141.0000 1.0000 1.0000 1.00002.0000 1.0000 1.0000 1.0000 1.00000.3971 0.7107 0.5720 0.7771 0.3341 0.6483 0.5795 0.0763 0.51540.7107 0.7107 0.5720 0.3341 0.3727 0.6483 0.5795 0.3505 0.51541.00002.0000 1.0000 1.0000 1.0000 1.0000 2.0000 1.0000 1.0000-0.5976 0.7577 0.0763 0.6320 -0.9859 0.2104 -0.5745 0.0926 0.63710.2551 0.6057 0.0763 0.6320 -0.9859 0.2104 0.1862 0.0926 0.06141.0000 1.0000 1.00002.0000 2.0000 1.0000 1.0000 1.0000 1.00000.50160.35341.0000错误率最小,为0.0812。