SVM神经网络的回归预测分析---上证指数开盘指数预测
SVM神经网络的回归预测分析---上证指数开盘指数预测
该案例作者申明:
1:本人长期驻扎在此板块里,对该案例提问,做到有问必答。
2:此案例有配套的教学视频,配套的完整可运行Matlab程序。
3:以下内容为该案例的部分内容(约占该案例完整内容的1/10)。
4:此案例为原创案例,转载请注明出处(Matlab中文论坛,《Matlab神经网络30个案例分析》)。
5:若此案例碰巧与您的研究有关联,我们欢迎您提意见,要求等,我们考虑后可以加在案例里。
6:您看到的以下内容为初稿,书籍的实际内容可能有少许出入,以书籍实际发行内容为准。
7:此书其他常见问题、预定方式等,请点击这里。
Contents
● 清空环境变量
● 数据的提取和预处理
● 选择回归预测分析最佳的SVM参数c&g
● 利用回归预测分析最佳的参数进行SVM网络训练
● SVM网络回归预测
● 结果分析
● 子函数 SVMcgForRegress.m
清空环境变量
function chapter14
tic;
close all;
clear;
clc;
format compact;
数据的提取和预处理
% 载入测试数据上证指数(1990.12.19-2009.08.19)
% 数据是一个4579*6的double型的矩阵,每一行表示每一天的上证指数
% 6列分别表示当天上证指数的开盘指数,指数最高值,指数最低值,收盘指数,当日交易量,当日交易额.
load chapter14_sh.mat;
% 提取数据
[m,n] = size(sh);
ts = sh(2:m,1);
tsx = sh(1:m-1,:);
% 画出原始上证指数的每日开盘数
figure;
file:////D|/学习/matlab学习/《MATLAB+神经网络3...析》程序和数据/案例14/案例14/html/chapter14.html(第 1/6 页)[2012-3-5 14:54:25]
SVM神经网络的回归预测分析---上证指数开盘指数预测
plot(ts,'LineWidth',2);
title('上证指数的每日开盘数(1990.12.20-2009.08.19)','FontSize',12);
grid on;
% print -dtiff -r600 original;
% 数据预处理,将原始数据进行归一化
ts = ts';
tsx = tsx';
% mapminmax为matlab自带的映射函数
% 对ts进行归一化
[TS,TSps] = mapminmax(ts,1,2);
% 画出原始上证指数的每日开盘数归一化后的图像
figure;
plot(TS,'LineWidth',2);
title('原始上证指数的每日开盘数归一化后的图像','FontSize',12);
grid on;
% print -dtiff -r600 scale;
% 对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( 'Best Cross Validation MSE = %g Best c = %g Best g = %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( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',
bestmse,bestc,bestg);
disp(str);
file:////D|/学习/matlab学习/《MATLAB+神经网络3...析》程序和数据/案例14/案例14/html/chapter14.html(第 2/6 页)[2012-3-5 14:54:25]
SVM神经网络的回归预测分析---上证指数开盘指数预测
打印粗略选择结果
Best Cross Validation MSE = 0.000961388 Best c = 0.25 Best g = 2
打印精细选择结果
Best Cross Validation MSE = 0.000961388 Best c = 0.25 Best g = 2
利用回归预测分析最佳的参数进行SVM网络训练
cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg) , ' -s 3 -p 0.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);
Mean squared error = 2.35705e-005 (regression)
Squared correlation coefficient = 0.999195 (regression)
均方误差 MSE = 2.35705e-005 相关系数 R = 99.9195%
结果分析
figure;
hold on;
plot(ts,'o-','LineWidth',1);
plot(predict,'r*-','LineWidth',1);
legend('原始数据','回归预测数据');
hold off;
grid on;
print -dtiff -r600 result;
figure;
error = predict - ts';
plot(error,'r*');
title('误差(predicted data - original data)','FontSize',12);
grid on;
% print -dtiff -r600 resulterror;
snapnow;
toc;
file:////D|/学习/matlab学习/《MATLAB+神经网络3...析》程序和数据/案例14/案例14/html/chapter14.html(第 3/6 页)[2012-3-5 14:54:25]
SVM神经网络的回归预测分析---上证指数开盘指数预测
Elapsed time is 110.417548 seconds.
子函数 SVMcgForRegress.m
function [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,
v,cstep,gstep,msestep)
% SVMcgForClass
% 输入:
% train_label:训练集标签(待回归的变量).要求与libsvm工具箱中要求一致.
% train:训练集(因变量).要求与libsvm工具箱中要求一致.
% cmin:惩罚参数c的变化范围的最小值(取以2为底的对数后),即 c_min = 2^(cmin).默认为 -5
% cmax:惩罚参数c的变化范围的最大值(取以2为底的对数后),即 c_max = 2^(cmax).默认为 5
% gmin:参数g的变化范围的最小值(取以2为底的对数后),即 g_min = 2^(gmin).默认为 -5
% gmax:参数g的变化范围的最小值(取以2为底的对数后),即 g_min = 2^(gmax).默认为 5
% v:cross validation的参数,即给测试集分为几部分进行cross validation.默认为 3
% cstep:参数c步进的大小.默认为 1
% gstep:参数g步进的大小.默认为 1
% msestep:最后显示MSE图时的步进大小.默认为 0.1
% 输出:
% mse:Cross Validation 过程中的最低的均方误差
% bestc:最佳的参数c
% bestg:最佳的参数g
% about the parameters of SVMcgForRegress
if nargin < 10
msestep = 0.1;
end
if nargin < 7
v = 3;
cstep = 1;
gstep = 1;
end
if nargin < 6
v = 3;
cstep = 1;
gstep = 1;
gmax = 5;
end
if nargin < 5
v = 3;
cstep = 1;
gstep = 1;
gmax = 5;
gmin = -5;
end
if nargin < 4
v = 3;
cstep = 1;
file:////D|/学习/matlab学习/《MATLAB+神经网络3...析》程序和数据/案例14/案例14/html/chapter14.html(第 4/6 页)[2012-3-5 14:54:25]
SVM神经网络的回归预测分析---上证指数开盘指数预测
gstep = 1;
gmax = 5;
gmin = -5;
cmax = 5;
end
if nargin < 3
v = 3;
cstep = 1;
gstep = 1;
gmax = 5;
gmin = -5;
cmax = 5;
cmin = -5;
end
% X:c Y:g cg:mse
[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
[m,n] = size(X);
cg = zeros(m,n);
% record accuracy with different c & g,and find the best mse with the smallest c
bestc = 0;
bestg = 0;
mse = 10^10;
basenum = 2;
for i = 1:m
for j = 1:n
cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',
num2str( basenum^Y(i,j) ),' -s 3'];
cg(i,j) = svmtrain(train_label, train, cmd);
if cg(i,j) < mse
mse = cg(i,j);
bestc = basenum^X(i,j);
bestg = basenum^Y(i,j);
end
if ( cg(i,j) == mse && bestc > basenum^X(i,j) )
mse = cg(i,j);
bestc = basenum^X(i,j);
bestg = basenum^Y(i,j);
end
end
end
% draw the accuracy with different c & g
[cg,ps] = mapminmax(cg,0,1);
figure;
subplot(1,2,1);
[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);
title('参数选择结果图(等高线图)','FontSize',12);
grid on;
subplot(1,2,2);
meshc(X,Y,cg);
file:////D|/学习/matlab学习/《MATLAB+神经网络3...析》程序和数据/案例14/案例14/html/chapter14.html(第 5/6 页)[2012-3-5 14:54:25]
SVM神经网络的回归预测分析---上证指数开盘指数预测
% 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);
title('参数选择结果图(3D视图)','FontSize',12);
% filename = ['c',num2str(bestc),'g',num2str(bestg),num2str(msestep),'.tif'];
% print('-dtiff','-r600',filename);
版权所有:Matlab中文论坛
Published with MATLAB® 7.9
file:////D|/学习/matlab学习/《MATLAB+神经网络3...析》程序和数据/案例14/案例14/html/chapter14.html(第 6/6 页)[2012-3-5 14:54:25]