多输入单输出
使用SVM做预测的时候,涉及到数据处理,这里强调一下,其它预测算法也适用,我们经常将收集数据集进行归一化、标准化,其实,只需要对部分数据进行归一化即可。
归一化的目的是将输入向量中的各属性之间的数量级拉近,如果量级相差过大会影响最终的预测结果,使的预测结果失真。因此,我们要对负荷数据进行归一化处理。
SVM 中核函数的选择和参数非常重要。根据核函数的不同映射特性,可以将核函数分为全局核函数和局部核函数。其中多项式核函数1为典型全局核函数,而径向基核函数2为典型局部核函数。局部性核函数仅仅在测试点附近小领域内对数据点有影响,其学习能力强、泛化性能较弱;而全局性核函数则相对来说泛化性能较强、学习能力较弱。
这里给出一个创新点,是局部核函数和全局核函数结合起来,组合核函数如下:
K = a×K_local+b×K_global;a和b为组合核函数的权值系数
输入数据归一化问题,观察数据格式:
|
其实只需要将x1、x2、y这三个变量进行归一化即可,尽量不要变动其它数据,以免引入误差。
采用mapminmax函数做一维归一化时,应注意数据格式,格式是行向量,列向量需要转置一下才能完成归一化,matlab中mapminmax函数的缺点是输入一维行向量数据,输出不报错。这就造成你做数据预测时,程序没有报错,预测结果看不懂!
mapminmax函数输入多维数据的话就不用考虑转置问题。
clear; clc;close all;
% 五输入:5*39
% 一输出:1*39
data=xlsread('data.xlsx','Sheet2','A2:F40');
%%
%***********************************************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);
[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 = data_6(1:30);% y
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 = data_6(31:39);
%建立回归模型
[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);
%预测
[ptesty,mse,prob] = svmpredict(data_test_out,data_test_in,model);%mse:均方误差和相关系数
data_test_out = data_test_out';
data_test_out = mapminmax('reverse',data_test_out,ps6);%去归一化
ptesty = ptesty';
ptesty = mapminmax('reverse',ptesty,ps6);%去归一化
figure;
plot(data_test_out);
hold on;
plot(ptesty);
legend('实际值','预测值')
观察运行结果,预测效果还不错。
归一化处理数据。
function data = normalization(x)
d = size(x);
data = zeros(d(1),d(2));
for i = 1:d(2)
l = x(:,i);
data(:,i) = (l - min(l))/(max(l)-min(l));
end
end