matlab30个G,关于matlab30个案例14章svm最佳参数c,g的问题

% 基于SVM的回归预测分析——上证指数开盘指数预测

% by 李洋(faruo)

%% 清空环境变量

function chapter_sh

tic;

close all;

clear;

clc;

format compact;

%% 数据的提取和预处理

% 载入测试数据上证指数(1990.12.19-2009.08.19)

% 数据是一个4579*6的double型的矩阵,每一行表示每一天的上证指数

% 6列分别表示当天上证指数的开盘指数,指数最高值,指数最低值,收盘指数,当日交易量,当日交易额.

load chapter_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);

grid on;

% 数据预处理,将原始数据进行归一化

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);

grid on;

% 对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);

%% 利用回归预测分析最佳的参数进行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);

%% 结果分析

figure;

hold on;

plot(ts,'-o');

plot(predict,'r-^');

legend('原始数据','回归预测数据');

hold off;

title('原始数据和回归预测数据对比','FontSize',12);

xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);

ylabel('开盘数','FontSize',12);

grid on;

figure;

error = predict - ts';

plot(error,'rd');

title('误差图(predicted data - original data)','FontSize',12);

xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);

ylabel('误差量','FontSize',12);

grid on;

figure;

error = (predict - ts')./ts';

plot(error,'rd');

title('相对误差图(predicted data - original data)/original data','FontSize',12);

xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);

ylabel('相对误差量','FontSize',12);

grid on;

snapnow;

toc;

%% 子函数 SVMcgForRegress.m

function [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)

% about the parameters of SVMcg

if nargin < 10

msestep = 0.06;

end

if nargin < 8

cstep = 0.8;

gstep = 0.8;

end

if nargin < 7

v = 5;

end

if nargin < 5

gmax = 8;

gmin = -8;

end

if nargin < 3

cmax = 8;

cmin = -8;

end

% X:c Y:g cg: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;

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 -p 0.1'];

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 abs( 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

% to draw the acc with different c & 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 = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...

' CVmse=',num2str(mse)];

title({firstline;secondline},'Fontsize',12);

grid on;

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 = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...

' CVmse=',num2str(mse)];

title({firstline;secondline},'Fontsize',12);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值