matlab30个案例分析案例14-SVM神经网络的回归预测分析.docx
《matlab30个案例分析案例14-SVM神经网络的回归预测分析.docx》由会员分享,可在线阅读,更多相关《matlab30个案例分析案例14-SVM神经网络的回归预测分析.docx(5页珍藏版)》请在冰豆网上搜索。
![matlab30个案例分析案例14-SVM神经网络的回归预测分析.docx](https://file1.bdocx.com/fileroot1/2022-10/9/ade65298-7064-47d7-825b-551ad470f405/ade65298-7064-47d7-825b-551ad470f4051.gif)
%%SVM神经网络的回归预测分析---上证指数开盘指数预测
%
%%清空环境变量
functionchapter14
tic;
closeall;
clear;
clc;
formatcompact;
%%数据的提取和预处理
%载入测试数据上证指数(1990.12.19-2009.08.19)
%数据是一个4579*6的double型的矩阵,每一行表示每一天的上证指数
%6列分别表示当天上证指数的开盘指数,指数最高值,指数最低值,收盘指数,当日交易量,当日交易额.
loadchapter14_sh.mat;
%提取数据
[m,n]=size(sh);
ts=sh(2:
m,1);
tsx=sh(1:
m-1,:
);
%画出原始上证指数的每日开盘数
figure;
plot(ts,'LineWidth',2);
title('上证指数的每日开盘数(1990.12.20-2009.08.19)','FontSize',12);
xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);
ylabel('开盘数','FontSize',12);
gridon;
%数据预处理,将原始数据进行归一化
ts=ts';
tsx=tsx';
%mapminmax为matlab自带的映射函数
%对ts进行归一化
[TS,TSps]=mapminmax(ts,1,2);
%画出原始上证指数的每日开盘数归一化后的图像
figure;
plot(TS,'LineWidth',2);
title('原始上证指数的每日开盘数归一化后的图像','FontSize',12);
xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);
ylabel('归一化后的开盘数','FontSize',12);
gridon;
%对TS进行转置,以符合libsvm工具箱的数据格式要求
TS=TS';
%mapminmax为matlab自带的映射函数
%对tsx进行归一化
[TSX,TSXps]=mapminmax(tsx,1,2);
%对TSX进行转置,以符合libsvm工具箱的数据格式要求
TSX=TSX';
%%选择回归预测分析最佳的SVM参数c&g
%首先进行粗略选择:
[bestmse,bestc,bestg]=SVMcgForRegress(TS,TSX,-8,8,-8,8);
%打印粗略选择结果
disp('打印粗略选择结果');
str=sprintf('BestCrossValidationMSE=%gBestc=%gBestg=%g',bestmse,bestc,bestg);
disp(str);
%根据粗略选择的结果图再进行精细选择:
[bestmse,bestc,bestg]=SVMcgForRegress(TS,TSX,-4,4,-4,4,3,0.5,0.5,0.05);
%打印精细选择结果
disp('打印精细选择结果');
str=sprintf('BestCrossValidationMSE=%gBestc=%gBestg=%g',bestmse,bestc,bestg);
disp(str);
%%利用回归预测分析最佳的参数进行SVM网络训练
cmd=['-c',num2str(bestc),'-g',num2str(bestg),'-s3-p0.01'];
model=svmtrain(TS,TSX,cmd);
%%SVM网络回归预测
[predict,mse]=svmpredict(TS,TSX,model);
predict=mapminmax('reverse',predict',TSps);
predict=predict';
%打印回归结果
str=sprintf('均方误差MSE=%g相关系数R=%g%%',mse
(2),mse(3)*100);
disp(str);
%%结果分析
figure;
holdon;
plot(ts,'-o');
plot(predict,'r-^');
legend('原始数据','回归预测数据');
holdoff;
title('原始数据和回归预测数据对比','FontSize',12);
xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);
ylabel('开盘数','FontSize',12);
gridon;
figure;
error=predict-ts';
plot(error,'rd');
title('误差图(predicteddata-originaldata)','FontSize',12);
xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);
ylabel('误差量','FontSize',12);
gridon;
figure;
error=(predict-ts')./ts';
plot(error,'rd');
title('相对误差图(predicteddata-originaldata)/originaldata','FontSize',12);
xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);
ylabel('相对误差量','FontSize',12);
gridon;
snapnow;
toc;
%%子函数SVMcgForRegress.m
function[mse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
%SVMcgcrossvalidationbyfaruto
%
%byfaruto
%Email:
patrick.lee@QQ:
516667408BNU
%lastmodified2010.01.17
%SuperModerator@
%若转载请注明:
%farutoandliyang,LIBSVM-farutoUltimateVersion
%atoolboxwithimplementsforsupportvectormachinesbasedonlibsvm,2009.
%Softwareavailableat
%
%Chih-ChungChangandChih-JenLin,LIBSVM:
alibraryfor
%supportvectormachines,2001.Softwareavailableat
%http:
//www.csie.ntu.edu.tw/~cjlin/libsvm
%abouttheparametersofSVMcg
ifnargin<10
msestep=0.06;
end
ifnargin<8
cstep=0.8;
gstep=0.8;
end
ifnargin<7
v=5;
end
ifnargin<5
gmax=8;
gmin=-8;
end
ifnargin<3
cmax=8;
cmin=-8;
end
%X:
cY:
gcg:
acc
[X,Y]=meshgrid(cmin:
cstep:
cmax,gmin:
gstep:
gmax);
[m,n]=size(X);
cg=zeros(m,n);
eps=10^(-4);
bestc=0;
bestg=0;
mse=Inf;
basenum=2;
fori=1:
m
forj=1:
n
cmd=['-v',num2str(v),'-c',num2str(basenum^X(i,j)),'-g',num2str(basenum^Y(i,j)),'-s3-p0.1'];
cg(i,j)=svmtrain(train_label,train,cmd);
ifcg(i,j)mse=cg(i,j);
bestc=basenum^X(i,j);
bestg=basenum^Y(i,j);
end
ifabs(cg(i,j)-mse)<=eps&&bestc>basenum^X(i,j)
mse=cg(i,j);
bestc=basenum^X(i,j);
bestg=basenum^Y(i,j);
end
end
end
%todrawtheaccwithdifferentc&g
[cg,ps]=mapminmax(cg,0,1);
figure;
[C,h]=contour(X,Y,cg,0:
msestep:
0.5);
clabel(C,h,'FontSize',10,'Color','r');
xlabel('log2c','FontSize',12);
ylabel('log2g','FontSize',12);
firstline='SVR参数选择结果图(等高线图)[GridSearchMethod]';
secondline=['Bestc=',num2str(bestc),'g=',num2str(bestg),...
'CVmse=',num2str(mse)];
title({firstline;secondline},'Fontsize',12);
gridon;
figure;
meshc(X,Y,cg);
%mesh(X,Y,cg);
%surf(X,Y,cg);
axis([cmin,cmax,gmin,gmax,0,1]);
xlabel('log2c','FontSize',12);
ylabel('log2g','FontSize',12);
zlabel('MSE','FontSize',12);
firstline='SVR参数选择结果图(3D视图)[GridSearchMethod]';
secondline=['Bestc=',num2str(bestc),'g='