《模式识别》课程实验设计matlaab.docx
《《模式识别》课程实验设计matlaab.docx》由会员分享,可在线阅读,更多相关《《模式识别》课程实验设计matlaab.docx(64页珍藏版)》请在冰豆网上搜索。
《模式识别》课程实验设计matlaab
《模式识别》课程实验设计(matlaab)
1线性分类器设计
1.1ESM
1.1.1问题
对于twotwolarge.m文件里的数据,用最小二乘法进行两分类。
1.1.2思路及框图
1.1.3结果
1.1.4程序代码
%ESM代码,见ses_pct_svm.m文件
y=ones(100,1);
fori=46:
100y(i,1)=-1;end;
w=inv(x'*x)*(x')*y;
r5=[-w(3)/w
(1),0];
r6=[0,-w(3)/w
(2)];
figure
(1);
plot(r1,r2,'*',r3,r4,'o',r5,r6);
axis([0,12,0,8]);
holdon;
%ESM代码结束
1.1.5讨论
1.当训练样本较大的时候,(inv(X'*X))*X'计算很复杂,可以采用梯度下降法求解。
2.Y的选取可以利用样本在两类里的数目进行比例取值,对于样本数较多的类,先验知识较多,yi可以取小。
1.2单层感知器
1.2.1问题
对于twotwolarge.m文件里的数据,用单层感知器进行两分类。
1.2.2思路及框图
1.2.3结果
1.2.4程序代码
%单层感知机函数代码,见ses_pct_svm.m文件
e=0.001;wpct=rands(3,1);J=0;deltJ=zeros(3,1);
fori=1:
45
xtemp=[x(i,1),x(i,2),x(i,3)];
if(wpct'*xtemp'<0)
deltJ=deltJ+0.5*(-1)*xtemp';
J=J+(-1)*wpct'*xtemp';
end
end
fori=46:
100
xtemp=[x(i,1),x(i,2),x(i,3)];
if(wpct'*xtemp'>0)
deltJ=deltJ+0.5*xtemp';
J=J+wpct'*xtemp';
end
end
while(J>e)
J=0;
wpct=wpct-deltJ;
fori=1:
45
xtemp=[x(i,1),x(i,2),x(i,3)];
if(wpct'*xtemp'<0)
deltJ=deltJ+0.5*(-1)*xtemp';
J=J+(-1)*wpct'*xtemp';
end
end
fori=46:
100
xtemp=[x(i,1),x(i,2),x(i,3)];
if(wpct'*xtemp'>0)
deltJ=deltJ+0.5*xtemp';
J=J+wpct'*xtemp';
end
end
end
r5=[-wpct(3)/wpct
(1),0];
r6=[0,-wpct(3)/wpct
(2)];
figure
(2);
plot(r1,r2,'*',r3,r4,'o',r5,r6);
axis([0,12,0,8]);
holdon;
%单层感知机函数代码结束
1.2.5讨论
1.感知器相当于一个神经元的神经网络。
2.能不能找到最优决策面与初始w选择有关,所以找到的w不一定是最优的。
3.满足J的w有无穷多个,不能判断哪一个最好。
1.3SVM
1.3.1问题
对于twotwolarge.m文件里的数据,用SVM进行两分类。
1.3.2思路及框图
1.3.3结果
1.3.4程序代码
%SVM函数代码,见ses_pct_svm.m文件
y=ones(100,1);
fori=46:
100
y(i)=-1;
end;
A=[];b=[];Aeq=[];beq=[];lb=[];ub=[];lbd0=ones(100,1);lbd=rands(100,1);
%本来想用Quadprog实现,但可能设定的条件不正确,最终出现不收敛的情况
[lbd,fval,EXITFLAG]=fmincon('myfun',lbd0,A,b,Aeq,beq,lb,ub,@nonlcon);
wsvm=zeros(2,1);
fori=1:
100
wsvm(1,1)=wsvm(1,1)+xnew(i,1)*(lbd(i,1)*y(i,1));
wsvm(2,1)=wsvm(2,1)+xnew(i,2)*(lbd(i,1)*y(i,1));
end;
%在实验数据中,可能是由于精度的原因,浪不大不可能迭代到真实的0,该变量作为0偏
epsilon=1e-5;
fori=1:
100
if(lbd(i,1)>epsilon)
lbdnozero=i;
end;
end;
%找到的该支撑矢量必然位于后一类,故决策值度量为-1
w3=-1-(wsvm(1,1)*xnew(lbdnozero,1)+wsvm(2,1)*xnew(lbdnozero,2));
r5=[-w3/wsvm
(1),0];
r6=[0,-w3/wsvm
(2)];
figure(3);
plot(r1,r2,'*',r3,r4,'o',r5,r6);
axis([0,12,0,8]);
holdon;
%ses_pct_svm.m代码结束
%目标函数位于一个新的myfun.m文档
functionf=myfun(lbd)
ft=-ones(100,1);
y=ones(100,1);
fori=46:
100
y(i)=-1;
end;
%数据域
xnew=zeros(100,2);
fori=1:
45xnew(i,1)=x1(i,1);end;
fori=1:
45xnew(i,2)=x1(i,2);end;
fori=46:
100xnew(i,1)=x2((i-45),1);end;
fori=46:
100xnew(i,2)=x2((i-45),2);end;
f=ft'*lbd;
fori=1:
100
forj=1:
100
f=f+0.5*(lbd(i,1)*lbd(j,1)*y(i,1)*y(j,1)*(xnew(i,1)*xnew(j,1)+xnew(i,2)*xnew(j,2)));
end;
end;
%myfun.m代码结束
%约束函数位于一个新的nonlcon.m文档
function[c,ceq]=nonlcon(lbd)
Y1=ones(45,1);
Y2=-ones(55,1);
Y=[Y1;Y2];
c=-lbd;
ceq=lbd'*Y;
%nonlcon.m代码结束
1.3.5讨论
对于fmincon函数里面的第一个参数要求是二次函数,该参数必须写到一个子程序里面然后引用该函数才可以使用。
同理,参数nonlcon也是一样。
如果两类不是线性可分的,那么需要增加一个对于浪不大的松弛变量,不过幸好此处线性可分。
21_k近邻法
2.1问题
对于twotwolarge.m、ultwotwo.m、threethree.m的数据进行分类
2.2思路
将数据随机分成两组,一组作为参考集,一组作为测试集,进行分类。
2.3结果
Twotwolarge结果:
前图是参考集,后图是测试集,是twotwolarge的随机等分组,砖石形为错误分类的点。
1近邻法的分类率为2%;k近邻法的错误分类率为0。
Ultwotwo随机分组得到的参考集
砖石形为错误分类的点。
1近邻法的分类率为7.62%;k近邻法的错误分类率为2.86%。
Threethree随机分组得到的参考集。
1和k近邻法的错误分类率均为0
2.4代码
%twotwolarge近邻法代码;数据前略,见twotwolarge_1k.m文件
xnewIndex=zeros(100,1);
fori=1:
100
xnewIndex(i,1)=i;
end;
[xnrSize,xntSize,xnrIndex,xntIndex,xnr,xnt]=sep(xnew,2,xnewIndex,0.5,100);
Nt=0;Nr=0;
fori=1:
xntSize
if(xntIndex(i,1)<=45)
Nt=Nt+1;
end;
end;
fori=1:
xnrSize
if(xnrIndex(i,1)<=45)
Nr=Nr+1;
end;
end;
fori=1:
Ntr5(i)=xnt(i,1);end;
fori=1:
Ntr6(i)=xnt(i,2);end;
fori=1+Nt:
50r7(i)=xnt(i,1);end;
fori=1+Nt:
50r8(i)=xnt(i,2);end;
fori=1:
Nrr9(i)=xnr(i,1);end;
fori=1:
Nrr10(i)=xnr(i,2);end;
fori=1+Nr:
50r11(i)=xnr(i,1);end;
fori=1+Nr:
50r12(i)=xnr(i,2);end;
figure
(2);
plot(r5,r6,'*',r7,r8,'o');
axis([0,12,0,8]);
gridon;
figure(3);
plot(r9,r10,'*',r11,r12,'o');
axis([0,12,0,8]);
gridon;
[FailCount,FailIndex]=OneNear(Nr,Nt,xnr,xnt,xnrSize,xntSize,2,2);
pe=FailCount/xntSize
if(pe>0)
fori=1:
FailCountr13(i)=xnt(FailIndex(i,1),1);end;
fori=1:
FailCountr14(i)=xnt(FailIndex(i,1),2);end;
figure(4);
plot(r5,r6,'*',r7,r8,'o',r13,r14,'bd');
axis([0,12,0,8]);
gridon;
end;
%k=7
Mk=7;
[MFailCount,MFailIndex]=MulNear(Mk,Nr,Nt,xnr,xnt,xnrSize,xntSize,2,2);
Mpe=MFailCount/xntSize
if(Mpe>0)
fori=1:
MFailCountr15(i)=xnt(MFailIndex(i,1),1);end;
fori=1:
MFailCountr16(i)=xnt(MFailIndex(i,1),2);end;
figure(5);
plot(r5,r6,'*',r7,r8,'o',r15,r16,'bd');
axis([0,12,0,8]);
gridon;
end;
%twotwolarge_1k.m代码结束
%ultwotwo近邻法代码;数据前略,见ultwotwo_1k.m文件
xnewIndex=zeros(210,1);
fori=1:
210
xnewIndex(i,1)=i;
end;
[xnrSize,xntSize,xnrIndex,xntIndex,xnr,xnt]=sep(xnew,2,xnewIndex,0.5,210);
Nt=0;Nr=0;
fori=1:
105
if(xntIndex(i,1)<=100)
Nt=Nt+1;
end;
if(xnrIndex(i,1)<=100)
Nr=Nr+1;
end;
end;
fori=1:
Ntr5(i)=xnt(i,1);end;
fori=1:
Ntr6(i)=xnt(i,2);end;
fori=1+Nt:
105r7(i)=xnt(i,1);end;
fori=1+Nt:
105r8(i)=xnt(i,2);end;
fori=1:
Nrr9(i)=xnr(i,1);end;
fori=1:
Nrr10(i)=xnr(i,2);end;
fori=1+Nr:
105r11(i)=xnr(i,1);end;
fori=1+Nr:
105r12(i)=xnr(i,2);end;
figure
(2);
plot(r5,r6,'*',r7,r8,'o');
axis([0,60,0,20]);
gridon;
figure(3);
plot(r9,r10,'*',r11,r12,'o');
axis([0,60,0,20]);
gridon;
[FailCount,FailIndex]=OneNear(Nr,Nt,xnr,xnt,xnrSize,xntSize,2,2);
pe=FailCount/xntSize
if(pe>0)
fori=1:
FailCountr13(i)=xnt(FailIndex(i,1),1);end;
fori=1:
FailCountr14(i)=xnt(FailIndex(i,1),2);end;
figure(4);
plot(r5,r6,'*',r7,r8,'o',r13,r14,'bd');
axis([0,60,0,20]);
gridon;
end;
%k=7
Mk=7;
[MFailCount,MFailIndex]=MulNear(Mk,Nr,Nt,xnr,xnt,xnrSize,xntSize,2,2);
Mpe=MFailCount/xntSize
if(Mpe>0)
fori=1:
MFailCountr15(i)=xnt(MFailIndex(i,1),1);end;
fori=1:
MFailCountr16(i)=xnt(MFailIndex(i,1),2);end;
figure(5);
plot(r5,r6,'*',r7,r8,'o',r15,r16,'bd');
axis([0,60,0,20]);
gridon;
end;
%ultwotwo_1k.m代码结束
%threethree近邻法代码;数据前略,见threethree_1k.m文件
xnewIndex=zeros(270,1);
fori=1:
270
xnewIndex(i,1)=i;
end;
[xnrSize,xntSize,xnrIndex,xntIndex,xnr,xnt]=sep(xnew,3,xnewIndex,0.5,270);
Nt1=0;Nr1=0;Nt2=0;Nr2=0;
fori=1:
xntSize
if(xntIndex(i,1)<=190)
Nt1=Nt1+1;
if(xntIndex(i,1)<=100)
Nt2=Nt2+1;
end;
end;
end;
fori=1:
xnrSize
if(xnrIndex(i,1)<=190)
Nr1=Nr1+1;
if(xnrIndex(i,1)<=100)
Nr2=Nr2+1;
end;
end;
end;
fori=1:
Nt2
r10(i)=xnt(i,1);r11(i)=xnt(i,2);r12(i)=xnt(i,3);
end;
fori=Nt2+1:
Nt1
r13(i)=xnt(i,1);r14(i)=xnt(i,2);r15(i)=xnt(i,3);
end;
fori=Nt1+1:
135
r16(i)=xnt(i,1);r17(i)=xnt(i,2);r18(i)=xnt(i,3);
end;
figure
(2);
plot3(r10,r11,r12,'*',r13,r14,r15,'o',r16,r17,r18,'.');
axis([-5,15,-10,30,-10,30]);
gridon;
fori=1:
Nr2
r19(i)=xnr(i,1);r20(i)=xnr(i,2);r21(i)=xnr(i,3);
end;
fori=Nr2+1:
Nr1
r22(i)=xnr(i,1);r23(i)=xnr(i,2);r24(i)=xnr(i,3);
end;
fori=Nr1+1:
135
r25(i)=xnr(i,1);r26(i)=xnr(i,2);r27(i)=xnr(i,3);
end;
figure(3);
plot3(r19,r20,r21,'*',r22,r23,r24,'o',r25,r26,r27,'.');
axis([-5,15,-10,30,-10,30]);
gridon;
Nr(1,1)=Nr2;Nr(2,1)=Nr1;Nt(1,1)=Nt2;Nt(2,1)=Nt1;
[FailCount,FailIndex]=OneNear(Nr,Nt,xnr,xnt,xnrSize,xntSize,3,3);
pe=FailCount/xntSize
if(pe>0)
fork=1:
FailCount
r28(k)=xnt(FailIndex(k,1),1);
r29(k)=xnt(FailIndex(k,1),2);
r30(k)=xnt(FailIndex(k,1),3);
end;
figure(4);
plot3(r10,r11,r12,'*',r13,r14,r15,'o',r16,r17,r18,'.',r28,r29,r30,'bd');
axis([-5,15,-10,30,-10,30]);
gridon;
end;
%k=7
Mk=7;
[MFailCount,MFailIndex]=MulNear(Mk,Nr,Nt,xnr,xnt,xnrSize,xntSize,3,3);
Mpe=MFailCount/135
if(Mpe>0)
forq=1:
MFailCount
r31(q)=xnt(MFailIndex(q,1),1);
r32(q)=xnt(MFailIndex(q,1),2);
r33(q)=xnt(MFailIndex(q,1),3);
end;
figure(5);
plot3(r10,r11,r12,'*',r13,r14,r15,'o',r16,r17,r18,'.',r31,r32,r33,'bd');
axis([-5,15,-10,30,-10,30]);
gridon;
end;
%threethree_1k.m代码结束
%随机分组函数sep.m
function[xnrSize,xntSize,xnrIndex,xntIndex,xnr,xnt]=sep(x,dem,xIndex,rfa,sizepre)
xntSize=double(int16(sizepre*rfa));xnrSize=sizepre-xntSize;
xnt=zeros(xntSize,dem);xnr=zeros(xnrSize,dem);
xntIndex=zeros(xntSize,1);xnrIndex=zeros(xnrSize,1);
i=1;
while(i<=xntSize)
rmn=xIndex(uint16((rand(1,1)*sizepre)+1),1);
quitflag=1;
forj=1:
i
if(xntIndex(j,1)==rmn)
quitflag=0;
break;
end;
end;
if(quitflag)
xntIndex(i,1)=rmn;
i=i+1;
end;
end;
xntIndex=sort(xntIndex);
xntIndexInx=zeros(xntSize,1);j=1;
fori=1:
xntSize
while(xntIndex(i,1)~=xIndex(j,1))
j=j+1;
end;
xntIndexInx(i,1)=j;
end;
i=1;j=1;randex=0;randpr=xntIndexInx(j,1);
while(i<=xnrSize)
if(j~=1)
randex=randpr;
if(j~=xntSize+1)
randpr=xntIndexInx(j,1);
else
randpr=sizepre+1;
end;
end;
randdelt=randpr-randex;
while(randdelt>1)
xnrIndex(i,1)=xIndex((randpr-randdelt+1),1);
randdelt=randdelt-1;
i=i+1;
end;
j=j+1;
end;
if(dem==2)
fori=1:
xnrSize
xnr(i,1)=x((xnrIndex(i,1)),1);xnr(i,2)=x((xnrIndex(i,1)),2);
end;
fori=1:
xntSize
xnt(i,1)=x((xntIndex(i,1)),1);xnt(i,2)=x((xntIndex(i,1)),2);
end;
end;
if(dem==3)
fori=1:
xnrSize
xnr(i,1)=x(xnrIndex(i,1),1);xnr(i,2)=x(xnrIndex(i,1),2);xnr(i,3)=x(xnrIndex(i,1),3);
end;
fori=1:
xntSize
xnt(i,1)=x(xntIndex(i,1),1);xnt(i,2)=x(xntIndex(i,1),2);xnt(i,3)=x(xntIndex(i,1),3);
end;
end;
%sep.m代码结束
%1近邻法分类函数OneNear.m
function[FailCount,FailIndex]=OneNear(xnrL,xntL,xnr,xnt,xnrCount,xntCount,CountL,dem)
FailCount=0;FailIndex=zeros(xntCount,1);
k=1;
fori=1:
xntCount
MinIndex=1;
if(dem==2)
MinOdis=(xnr(1,1)-xnt(i,1))^2+(xnr(1,2)-xnt(i,2))^2;
end;
if(dem==3)
MinOdis=(xnr(1,1)-xnt(i,1))^2+(xnr(1,2)-xnt(i,2))^2+(xnr(1,3)-xnt(i,3))^2;
end;
forj=1:
xnrCount
if(dem==2)
OdisTemp=(xnr(j,1)-xnt(i,1))^2+(xnr(j,2)-xnt(i,2))^2;
end;
if(dem==3)
OdisTemp=(xnr(j,1)-xnt(i,1))^2+(xnr(j,2)-xnt(i,2))^2+(xnr