一、EMD及SVM简介

1 引言
时间序列预测是将预测目标的历史数据按照时间的顺序排列成为时间序列,然后分析它随时间的变化趋势,外推预测值。时间序列预测,尤其是非平稳、非线性时间序列的预测在
经济、金融、工业、生物医学等领域中有着重要的应用。目前常用于时间序列预测的有回归模型和神经网络等方法,但是这些传统的单一预测方法难以在信息贫乏和不确定性条件下做出准确有效的预测?,这就使得必须根据时间序列波动趋势变化的规律和特点,找到一个鲁棒性强、预测精度高且实用的预测方法。
经验模式分解(Empirical Mode Decomposition, EMD) 可以根据信号自身的内在特性,将信息自适应地分解到不同的基本模式分量(Intrinsic Mode Function, IMF) 中, 是一种有效的非平稳、非线性信号分析方法。本文基于EMD和支持向量回归(Support Vector Regression, SVR) 方法, 提出一种新的混合智能预测模型,为非平稳、非线性时间序列的预测问题提供了很好的解决方法。纺织材料价格的预测实例充分表明该模型的准确性和有效性。

2 理论基础
2.1 经验模式分解

EMD可将任意信号分解为若干个IMF和一个余项的和34。所谓IMF就是满足如下两个条件的函数或信号:(1) 在整个数据序列中,极值点的数量(包括极大值点和极小值点)与过零
点的数量必须相等,或最多相差不多于一个;(2)任何一点,信号局部极大值确定的上包络线和局部极小值确定的下包络线的均值为零。EMD分解的具体步骤如下:
(1)假设信号为x(t),取其上下包络局部均值组成的序列为m(t),则:
h(t)=x(t)-m(t)(1)
对非线性、非平稳数据而言,一般一次处理不足以形成IMF, 一些非对称波仍然存在。把h(t) 看作待处理数据重复上述操作k次,得到:
【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_matlab
(2)当hg(t) 满足IMF的条件时, 就获得了第一个IMF, 记做斤(t)=hg(t)。
(2) 将第一个IMF从信号中分离出来, 得到剩余信号r, () 为:
r(t)=x(t)-f(t) (3)
【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_matlab_02
2.2 支持向量回归
SVR是由Vapnik等人于1995年提出的闯。该算法具有小样本学习、全局最优和推广能力强等突出优点,已成功应用于交通流量及风速预测等许多领域,并表现出比多层感知器等传统人工神经网络优越的预测性能。
【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_算法_03
【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_时间序列_04
3 混合智能预测模型
在采用单一SVR进行预测时,相同的时间序列采用不同的核函数会得到差别较大的预测结果。因此本文提出一种基于 EMD 和 SVR 的混合智能预测模型,很好地改善了预测效果。混合智能预测模型的基本计算流程如下:
【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_matlab_05

二、部分源代码

%% 清空环境变量
tic;
close all;
clear;
clc;
format compact;
%% 数据的提取和预处理
tsx=xlsread('001.xlsx','A1:H406');
ts=xlsread('001.xlsx','J1:J406');
ts = ts';
tsx = tsx';
[TS,TSps] = mapminmax(ts,1,2);	

[TSX,TSXps] = mapminmax(tsx,1,2);	
% 对数据进行转置,以符合格式要求
rand('seed',0)
[m n]=sort(rand(1,length(TS)));
m=350;
TSX1 = TSX(:,n(1:m))';
TS1 = TS(:,n(1:m))';
TSX2 = TSX(:,n(m+1:end))';
TS2 = TS(:,n(m+1:end))';

%% 选择回归预测分析最佳的SVM参数c&g
kerneltype=1;%kerneltype=0(线性核) 1(多项式核) 2(rbf核函数) 3(sigmoid核函数)
[bestmse,bestc,bestg] = SVMcgForRegress(TS1,TSX1,-4,4,-4,4,3,0.5,0.5,0.05,kerneltype);
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 -d 1'];
model = svmtrain(TS1,TSX1,cmd);
 function [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep,kerneltype) %v,cstep这些不写的话就是默认值
%
% 利用网格搜索与交叉验证进行核参数与惩罚参数选择
% cmin cmax c的取值范围
% gmin gmax g的取值范围
% v 就是交叉验证参数  一般是5折交叉验证
% cstep gstep 网格取值的步长
% msestep 误差的步长  只是为了最后画等高线图用一用,这样比较好看
% kerneltype=0(线性核) 1(多项式核) 2(rbf核函数) 3(sigmoid核函数)




[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  %每更改一组c g值,跑5折交叉验证  最终选择精度最高的那一组c g 
    for j = 1:n
        cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -s 3 -t ',num2str(kerneltype),' -p 0.1 -d 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

三、运行结果

【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_数据_06
【优化预测】基于matlab EMD优化SVR数据预测【含Matlab源码 1403期】_数据_07

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.
[4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.
[5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.
[6]王巍,赵宏,梁朝晖,马涛.基于EMD和SVR的混合智能预测模型及实证研究[J].计算机工程与应用. 2012,48(04)