赞
踩
使用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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。