当前位置:   article > 正文

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

多输入单输出预测模型

多输入单输出

使用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('实际值','预测值')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

观察运行结果,预测效果还不错。

在这里插入图片描述

归一化处理数据。

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号