SVM支持向量机的多输入多输出预测模型

多输入多输出

使用SVM做预测的时候,涉及到数据处理,这里强调一下,其它预测算法也适用,我们经常将收集数据集进行归一化、标准化,其实,只需要对部分数据进行归一化即可。

归一化的目的是将输入向量中的各属性之间的数量级拉近,如果量级相差过大会影响最终的预测结果,使的预测结果失真。因此,我们要对负荷数据进行归一化处理。

SVM中核函数的选择和参数非常重要。根据核函数的不同映射特性,可以将核函数分为全局核函数和局部核函数。其中多项式核函数1为典型全局核函数,而径向基核函数2为典型局部核函数。局部性核函数仅仅在测试点附近小领域内对数据点有影响,其学习能力强、泛化性能较弱;而全局性核函数则相对来说泛化性能较强、学习能力较弱。

这里给出一个创新点,是局部核函数和全局核函数结合起来,组合核函数如下:

K = a×K_local+b×K_global;a和b为组合核函数的权值系数

输入数据归一化问题,观察数据格式:

在这里插入图片描述

只需要将x1、x2、(y1与y2)这四个变量进行归一化即可,尽量不要变动其它数据,以免引入误差。这里为什么不对x1与x2一起做归一化操作,因为反归一化用不到它们,x1与x2也可以一起做归一化。

| 在这里插入图片描述

采用mapminmax函数做一维归一化时,应注意数据格式,格式是行向量,列向量需要转置一下才能完成归一化,matlab中mapminmax函数的缺点是输入一维行向量数据,输出不报错。这就造成你做数据预测时,程序没有报错,预测结果看不懂!

上述数据基于第一篇的数据y-7得到y2数据,这里为了验证多输入多输出实验,不严谨,所以预测结果变化趋势相同,但方法和思路正确。

clear; clc;close all;
% 五输入:5*39
% 二输出:2*39
% 回归预测
data=xlsread('data.xlsx','Sheet3','A2:G40');
%%
%***********************************************SVR**********************************%
%归一化
data_1 = data(:,1);
data_2 = data(:,2);
data_3 = data(:,3);
data_4 = data(:,4);
data_5 = data(:,5);
data_6 = data(:,6:7);% y1与y2一起做归一化,因为后面用到它的反归一化。


[data_1,ps0] = mapminmax(data_1',0,1);
[data_2,ps1] = mapminmax(data_2',0,1);
[data_6,ps6] = mapminmax(data_6',0,1);


data_1 = data_1';
data_2 = data_2';
data_6 = data_6';



%数据集
data_train_in(:,1) = data_1(1:30);% x1
data_train_in(:,2) = data_2(1:30);% x2
data_train_in(:,3) = data_3(1:30);% x3
data_train_in(:,4) = data_4(1:30);% x4
data_train_in(:,5) = data_5(1:30);% x5

data_train_out(:,1) = data_6(1:30,1);% y1
data_train_out(:,2) = data_6(1:30,2);% y2

data_test_in(:,1) = data_1(31:39);
data_test_in(:,2) = data_2(31:39);
data_test_in(:,3) = data_3(31:39);
data_test_in(:,4) = data_4(31:39);
data_test_in(:,5) = data_5(31:39);
data_test_out(:,1) = data_6(31:39,1)';
data_test_out(:,2) = data_6(31:39,1)';

%建立回归模型
[bestmse,bestc,bestg] = SVMcgForRegress(data_train_out,data_train_in,-2,2,-2,2,3,0.1,0.1);%cmin,cmax,gmin,gmax,v,cstep,gstep,msestep 
% [bestmse,bestc,bestg] = gaSVMcgForRegress(data_train_out,data_train_in);
% pso_option = struct('c1',1.5,'c2',1.7,'maxgen',200,'sizepop',20, ...
%                     'k',0.6,'wV',1,'wP',1,'v',5, ...
%                      'popcmax',2^2,'popcmin',10^(-1),'popgmax',2^2,'popgmin',10^(-2));
% [bestmse,bestc,bestg] = psoSVMcgForRegress(data_train_out,data_train_in,pso_option);
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -t 2 -p 0.01'];
%%%%%  -c 惩罚系数,默认1
%%%%%  -g 核函数参数,默认1/K,K为特征数
%%%%%  -s SVM类型  0 - C-SVC  1 - V-SVC  2 - One-Class-SVM  3 - e-SVR  4 - n-SVR
%%%%%  -t 核函数类型 0 - 线性核  1 - 多项式核  2 - RBF核  3 - Sigmoid核  
%%%%%  -p 损失函数参数,默认0.1
%%%%%  -v 交叉验证参数,默认3
model = svmtrain(data_train_out,data_train_in,cmd);

%预测
for i=1:2
    [ptesty(:,i),mse,prob] = svmpredict(data_test_out(:,i),data_test_in,model);%mse:均方误差和相关系数
end

data_test_out = data_test_out';
data_test_out = mapminmax('reverse',data_test_out,ps6);%去归一化
ptesty = ptesty';
ptesty = mapminmax('reverse',ptesty,ps6);%去归一化


figure;
subplot(121)
plot(data_test_out(1,:));
hold on;
plot(ptesty(1,:));
legend('实际值','预测值')
subplot(122)
plot(data_test_out(2,:));
hold on;
plot(ptesty(2,:));
legend('实际值','预测值')
  • 5
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨铮...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值