资源描述
模式识别第二次作业 1、调用 函数(matlab 工具箱函数)替代 svm_matlab 中的 fmincon 函数。seqminopt函数的调用方法如下形式:ALPHA OFFSET=seqminopt(TRAINING,Y,BOXC,KERNELFUNC,SMOOPTIONS)输入输出各变量含义如下:TRAINING 待训练数据 Y 列向量,代表响应数据,为1 BOXC 松弛变量,列向量 KERNELFUNC 句柄 SMOOPTIONS 可选,用于设置迭代次数等 ALPHA 优化得到的 OFFSET 超平面偏移 使用 fmincon 函数结果为:W_fmincon=用 seqminopt 替换 fmincon 后结果为:W_seqminopt=可以发现两种形式下结果是一样的。设置 100 个离散点,分类结果为:程序 close all;clear all;clc%生成训练数据 =100;=1*3;5;=randn(2,+kron,ones(1,);=50;=randn(2,+kron,ones(1,);=100;=-1*3;5;=randn(2,+kron,ones(1,);=50;=randn(2,+kron,ones(1,);TestMatrix=zeros(2);cnt_c1=1;cnt_c2=1;tt=1:1000;tt=(tt-500)*;figure;plot(1,:),(2,:),bo,linewidth,2,markersize,5)hold on;plot(1,:),(2,:),ko,linewidth,2,markersize,5)%要训练的数据及其类别 cnt=1;X=zeros+,3);for iii=1:X(cnt,1:2)=(:,iii);X(cnt,3)=1;y(cnt,1)=1;cnt=cnt+1;end for iii=1:X(cnt,1:2)=(:,iii);X(cnt,3)=1;y(cnt,1)=-1;cnt=cnt+1;end%替换为 seqminopt 后不用下面这个 cnt=1;Xsvm=zeros+,3);for iii=1:Xsvm(cnt,1:2)=-1*(:,iii);Xsvm(cnt,3)=-1*1;ysvm(cnt,1)=-1;cnt=cnt+1;end for iii=1:Xsvm(cnt,1:2)=(:,iii);Xsvm(cnt,3)=1;ysvm(cnt,1)=-1;cnt=cnt+1;end%下面就是替换为 seqminopt traindata=X(:,1:2);%用 X 而不是 Xsvm trainlabel=y;%用 y 而非 ysvm boxConstraints=ones(size(trainlabel);%松弛变量,我默认为 1 kfun=linear_kernel;%线性函数句柄 alphas,bias=seqminopt(traindata,trainlabel,boxConstraints,kfun);svIndex=find(alphas sqrt(eps);%寻找支持向量的索引 sv=traindata(svIndex,:);%对应 x(i)alphaHat=trainlabel(svIndex).*alphas(svIndex);%对应 y(i)*(i)weight=zeros(1,2);%W=sum(y(i)*(i)*x(i)for i=1:length(svIndex)weight=weight+alphaHat(i)*sv(i,:);end W=zeros(3,1);W(1:2)=weight;W(3)=bias;W_seqminopt=W%用来做对比%fmincon_options=optimset(Algorithm,interior-point,.MaxIter,50);W1,val,exflag,output=fmincon(x)(norm(x(1:2),2),0;0;1,.Xsvm,ysvm,fmincon_options);W_fmincon=W1%做对比%for kkk=1:TMP_Tr(1:2,1)=(:,kkk);TMP_Tr(3,1)=1;yy=W.*TMP_Tr;if(yy 0)Result_c1(:,cnt_c1)=(:,kkk);cnt_c1=cnt_c1+1;TestMatrix(1,1)=TestMatrix(1,1)+1;else Result_c2(:,cnt_c2)=(:,kkk);cnt_c2=cnt_c2+1;TestMatrix(1,2)=TestMatrix(1,2)+1;end end for kkk=1:TMP_Tr(1:2,1)=(:,kkk);TMP_Tr(3,1)=1;yy=W.*TMP_Tr;if(yy 0)Result_c1(:,cnt_c1)=(:,kkk);cnt_c1=cnt_c1+1;TestMatrix(2,1)=TestMatrix(2,1)+1;else Result_c2(:,cnt_c2)=(:,kkk);cnt_c2=cnt_c2+1;TestMatrix(2,2)=TestMatrix(2,2)+1;end end TestMatrix(1,:)=TestMatrix(1,:)/;TestMatrix(2,:)=TestMatrix(2,:)/;TestMatrix figure;try plot(Result_c1(1,:),Result_c1(2,:),bo,linewidth,2,markersize,5)end hold on try plot(Result_c2(1,:),Result_c2(2,:),ko,linewidth,2,markersize,5)end%plot(1,:),(2,:),r+,linewidth,2,markersize,10)%plot(1,:),(2,:),b+,linewidth,2,markersize,10)WW=W;WW=WW/norm(WW);plot(tt,-1*(WW(1)/WW(2)*tt+WW(3)/WW(2),linewidth,2)xlabel(x_1)ylabe(x_2)
展开阅读全文