📄 classification_svm_stevegunn.m
字号:
% 支持向量机用于二类模式分类 - 必须选择最优参数 p1,C% 工具箱:SVM_SteveGunn% 使用平台:Matlab6.5% 作者:jzhang%email:zj8455@126.comclcclearclose all%format long e%---------------------------------------------------load heart.txt;% load SPECTFtest.txt;trnY=ones(200,1)-heart(1:200,14);n=length(trnY);for k=1:n if trnY(k,1)==0 trnY(k,1)=-1; else trnY(k,1)=trnY(k,1); endendn1=length(ones(1,n)*heart(1:n,:));trna=heart(1:200,1:(n1-1));max_trna=max(trna);min_trna=min(trna);trnc=trna-ones(n,1)*min_trna;trnX=trnc./(ones(n,1)*(max_trna-min_trna));tstY=ones(96,1)-heart(201:296,14);m=length(tstY);for t=1:m if tstY(t,1)==0 tstY(t,1)=-1; else tstY(t,1)=tstY(t,1); endendtsta=heart(201:296,1:(n1-1));max_tsta=max(tsta);min_tsta=min(tsta);tstc=tsta-ones(m,1)*min_tsta; tstX=tstc./(ones(m,1)*(max_tsta-min_tsta));% %---------------------------------------------------% 参数设置% trnX = xn_train';% trnY = dn_train';% tstX = xn_test';% tstY = dn_test';xaxis=1;yaxis=2;%ker1 = 'kstyle';ker1= 'rbf';% 核函数 k = exp(-(u-v)*(u-v)'/(2*p1^2))global p1 ;%p1 = 0.05; % p1 is width of rbfs (sigma)%C = 200;% 折衷系数% global pj pb% pj=0.9;% pb=0.1;aspect=0;mag=0.1;% bpc=0;maxbestper=0;bestnum=0;minbestnum=0;%input=zeros(1,size(trnX,2));%--------------------------------------------------------------------%初始化遗传算法种群% par=floor(rand(10,(n1-1))+0.5*ones(10,(n1-1))); tic% for num=1:20% for l=1:10% %----------------------------------------------------------------% X=trnX1.*(ones(n,1)*par(l,:));%定义训练样本% trnX=X(:,any(X));% TX=tstX1.*(ones(m,1)*par(l,:));%定义测试样本% tstX=TX(:,any(TX));%-------------------------------------bestPercent1 =0;xl=[0.7 0.3];%初始输入参数a=[10 0.001];b=[400 40 ];xk=[200 20 ].*xl;%--------------------------------------------%用混沌算法粗搜索fprintf('training ...\n');for i=1:15%while abs(merr-maxerr)>eep1=xk(2);C=xk(1);%el=xk(3);t=(xk-a)./(b-a);%disp('输出寻环数');%i%disp('输出选择的参数');%xk%---------------------------------------------------% 训练与测试(K型) [nsv1,alpha1,bias1] = svc(trnX,trnY,ker1,C); % 训练actfunc = 0; % 1 为实际输出,0 为取sign输出 predictedY1 = svcoutput(trnX,trnY,tstX,ker1,alpha1,bias1,actfunc); % 测试%---------------------------------------------------% 结果统计Result1 = ~abs(predictedY1-tstY); % 正确分类显示为1Percent1 = sum(Result1)/length(Result1); % 正确分类率%-----------------------------------------------------------%max_Percent1=max(Percent1);%max_err%disp('输出预测中误差');%mPercent1=sqrt(Percent1'*Percent1/10);%merr% h1=svcplot(trnX,trnY,ker1,alpha1,bias1,aspect,mag,xaxis,yaxis,input); err=svcerror(trnX,trnY,tstX,tstY,ker1,alpha1,bias1);if(Percent1>bestPercent1) t=4*t.*(ones(1,2)-t); %t xkk=xk;% xk=a+(b-a).*t; if(0<t<0.2) xk=a+(b-a).*t.^0.5; elseif(0.2<=t<0.8) xk=a+(b-a).*t; else xk=a+(b-a).*t.^2.5; end bestPercent1=Percent1; bestpredictedY1=predictedY1; %h1=svcplot(trnX,trnY,ker1,alpha1,bias1,aspect,mag,xaxis,yaxis,input); %bestPercent1=maxPercent1; % bestmax_Percent1=max_Percent1; % bestmPercent1=mPercent1; besti=i; besterr=err; %best_t_computer=t_computer;else t=4*t.*(ones(1,2)-t); xk=a+(b-a).*t;% if(0<t<0.2)% xk=a+(b-a).*t.^0.5;% elseif(0.2<=t<0.8)% xk=a+(b-a).*t% else% xk=a+(b-a).*t.^2.5;% endend%maxerrenddisp('输出最优预测最大正确率');bestPercent1% xkk(1)% xkk(2)%--------------------------------------------------------------------------%用粒子群算法进行细搜索Cbest=xkk(1);p1best=xkk(2);w1max=1.2;%表示惯性权重w2max=1.1;w1min=0.3;w2min=0.1;cmax=0.05;pmax=0.005;cc=1.5;%表示学习因子cp=1.5;% v=rand(1,2);%初始化粒子群速度% vc=0.05*v(1);% vp=0.005*v(2);bestj=0;jmax=5;for j=1:jmax vc=cc*rand(1)*(xkk(1)-Cbest); w1=w1max-j*(w1max-w1min)/jmax; if abs(vc)<cmax xkk(1)=w1*xkk(1)+vc; else xkk(1)=w1*xkk(1)+cmax; end vp=cp*rand(1)*(xkk(2)-p1best); w2=w2max-j*(w1max-w2min)/jmax; if abs(vp)<pmax xkk(2)=w2*xkk(2)+vp; else xkk(2)=w2*xkk(2)+pmax; end C=xkk(1); p1=xkk(2); %--------------------------------------------------- % 训练与测试(K型) [nsv1,alpha1,bias1] = svc(trnX,trnY,ker1,C); % 训练actfunc = 0; % 1 为实际输出,0 为取sign输出 predictedY1 = svcoutput(trnX,trnY,tstX,ker1,alpha1,bias1,actfunc); % 测试%---------------------------------------------------% 结果统计Result1 = ~abs(predictedY1-tstY); % 正确分类显示为1Percent1 = sum(Result1)/length(Result1); % 正确分类率%-----------------------------------------------------------% h1=svcplot(trnX,trnY,ker1,alpha1,bias1,aspect,mag,xaxis,yaxis,input);err=svcerror(trnX,trnY,tstX,tstY,ker1,alpha1,bias1);% disp('输出预测正确分类');% max_Percent1=max(Percent1);% max_Percent1% disp('输出预测中正确分类');%mPercent1=sqrt(Percent1'*Percent1/10);if Percent1>bestPercent1 Cbest=xkk(1); p1best=xkk(2); bestpredictedY1=predictedY1; bestPercent1=Percent1; %maxPercent1=bestPercent1; %bestmax_Percent1=max_Percent1; %h1=svcplot(trnX,trnY,ker1,alpha1,bias1,aspect,mag,xaxis,yaxis,input); besterr=err; bestj=j; else j=j+1; endend disp('输出是哪次循环'); besti bestj disp('输出选择的参数'); Cbest p1best disp('输出错误数'); besterr disp('输出某次最大正确率'); bestPercent1% if bestPercent1>bpc% bpc=bestPercent1;% end% bpc(l)=bestPercent1;% fac(l,:)=par(l,:);% mbesterr(l)=besterr;% disp('输出每个个体的转换因子');% par(l,:)% %pause% end% bestper(num)=max(bpc);% mberr=min(mbesterr);% %---------------------------------------% % disp('输出每一代的个体的最优正确率');% % generind(num)=bpc;% % generind% disp('输出某代最大正确率');% bestper% % fac% bpc% %选择个体;% %---------------------------------------------------------------% pc=rand(1,6);% for kk=1:6% fpc=bpc/(sum(bpc));% fbpc=cumsum(fpc,2);% rst_num=min(find(pc(kk)<fbpc));% pop(kk,:)=par(rst_num,:);% %par(rst_num,:)=0;% end% disp('output pop');% pop% % pc% % fbpc% %pause;% for kk1=1:6% fpc=bpc/(sum(bpc));% fbpc=cumsum(fpc,2);% rst_num=min(find(pc(kk)<fbpc));% %pop(kk,:)=par(rst_num,:);% par(rst_num,:)=0;% end% %以概率pj进行重组和交叉% %---------------------------------------------------------------------% pj1=rand(1);% if pj1<pj% mode=floor(rand(3,(n1-1))+0.5*ones(3,(n1-1)));% mask=mode(1:3,:);% newchromodd=pop(1:2:5,:).*mask+pop(2:2:6,:).*(~mask);% newchromeven=pop(1:2:5,:).*(~mask)+pop(2:2:6,:).*mask;% % else% % break% end% par1=par(any(par'),:);% %-------------------------------------------------------------------% %----------------------------------------------------------------------% [nn,ans]=size(par1);% mm=zeros(1,nn);% mm(:,1:4)=1;% pslect=randperm(nn).*mm;% bslect=ones(2,1)*pslect;% mslect=bslect(:,any(bslect));% eslect=mslect.*([1;0]*ones(1,4));% fslect=eslect(any(eslect'),:);% fmm=zeros(1,nn);% fmm(:,[fslect])=1;% par1=par1.*(ones((n1-1),1)*fmm)';% par11=par1(any(par1'),:);% par2=[newchromodd;newchromeven;par11];% % %依概率pb进行基因组变异% %-------------------------------------------------------------------------% pb1=rand(1);% if pb1<pb% n2=randint(10,1,(n1-1))+1;% tmp=zeros(10,(n1-1));% tmp(:,(n1-1))=1;% par2=tmp+par2;% par2=mod(par2,2);% % else% % par=par2;% end% if pj1>=pj&pb1>=pb% par=par;% else% par=par2;% end% disp('输出遗传进化代数');% num% par% %pause;% if bestper(num)>maxbestper&abs(bestper(num)-0.9198)>1e-4% maxbestper=bestper(num);% bestnum=num;% bestfac=fac;% bestbpc=bpc;% minbesterr=mberr;% end% end% %maxbestper=max(bestper);% %--------------------------------------------------------------------------% %-------------------------------------------------------------------------t_computer = toc;% % disp('输出是哪次循环');% % besti% % bestj% % disp('输出选择的参数');% % Cbest% % p1best% % disp('输出错误数');% % besterr% % disp('输出某次最大正确率');% % bestPercent1% disp('输出最大正确率');% maxbestper% disp('输出最大正确率的世代数');% bestnum% disp('输出最大正确率的选择因子');% bestfac% bestbpc% disp('output number of min err');% minbesterr fprintf('computing time is t_computer:\n'); t_computer% ------------------------------------------------------------%%save data maxbestper bestnum bestfac bestbpc minbesterr; %f1=figure;%actfunc = 0;%h1=svcplot(trnX,trnY,ker1,alpha2,bias2,aspect,mag,xaxis,yaxis,input);%err=svcerror(trnX,trnY,tstX,tstY,ker1,alpha2,bias2);%-----------------------------------------------------------------% % 训练与测试(高斯型) % % [nsv2,alpha2,bias2] = svc(trnX,trnY,ker2,C); % 训练% % actfunc = 0; % 1 为实际输出,0 为取sign输出 % predictedY2 = svcoutput(trnX,trnY,tstX,ker2,alpha2,bias2,actfunc); % 测试% % %---------------------------------------------------% % 结果统计% % Result2 = ~abs(predictedY2-tstY) % 正确分类显示为1% Percent2 = sum(Result2)/length(Result2) % 正确分类率% %---------------------------------------------------------------% f2=figure;% h2=svcplot(trnX,trnY,ker2,alpha2,bias2,aspect,mag,xaxis,yaxis,input)% err2=svcerror(trnX,trnY,tstX,tstY,ker2,alpha2,bias2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -