0
点赞
收藏
分享

微信扫一扫

​【BP预测】基于经验模态分解结合BP神经网络实现数据回归预测matlab代码

三分梦_0bc3 2022-01-05 阅读 56

1 简介

为提高农机总动力增长变化预测结果的准确性和可靠性,根据农机总动力增长变化与其影响因素之间具有在各时间尺度明显的非线性波动特征,提出以1986—2013年农机总动力增长为研究对象,分别对农机总动力增长及其影响因素时间序列数据进行经验模态分解(empirical mode decomposition,EMD),对得到的各时间尺度下的波动分量分别建立BP神经网络预测模型.将EMD-BP网络预测结果与多元线性回归,支持向量机,BP神经网络进行对比分析,结果表明:基于EMD-BP网络建立的农机总动力增长预测模型,拟合和预测平均相对误差分别为0.99%和1.29%,相关决定系数约为0.999,均方根误差为316.35 MW,模型评价等级为"好",各项精度评价指标都优于其他方法,因此该预测模型精度高,可靠性强.研究成果为农业机械化发展规划的制定和出台相关政策提供有效参考.

EMD 分解法的本质是对非线性、非平稳波动的数据信号不断的分离出高频分量,得到满足条件的本征模态函数(IMF),直到所有频率成分都被分离出来,得到有限个 IMF,每个 IMF 包含原始数据信号不同时间尺度的局部特征信号,并且满足 2 个条件:1)在整个时间序列数据范围内,过局部极值点的数目和过零点的数目相等或最多相差 1 个;2)在任意时间点,由局部最大值拟合的上包络线和局部最小值拟合的下包络线的平均值必须为零。EMD 分解后用原始数据减去各 IMF 得到的残余数值称为趋势量,趋势量能反映数据信号的发展趋势。

2 部分代码

clc;

clear all

close all

data=xlsread('1.xlsx','秦皇岛港动力煤价格(每周的价格)','D3:D673')';

lag=3;% 采用前lag时刻的价格数据作为神经网络的输入变量,第 lag+1 时刻价格数据作为输出变量。

T=1:length(data); %输入时间

x=data;

n=length(data);

%% 训练集制作

inputs=zeros(lag,n-lag);

for i=1:n-lag

    inputs(:,i)=x(i:i+lag-1)';%形成训练集输入网络

end

targets=x(lag+1:end);%训练集输出

%%  数据归一化

[p_train, ps_input] = mapminmax(inputs,0,1);

[t_train, ps_output] = mapminmax(targets,0,1);

%% 创建网络

%     net=newff(P,T,[S1 S2…SN1],{TF1 TF2…TFN1},BTF,BLF,PF);%

% PT:输入矩阵和目标矩阵

% S1 S2 SN1 网络隐含层神经元个数

% TF1 TF2… TFN1 传输函数,默认tansing。

% (常用有三种 s型对数函数logsig 双曲正切型tansig 线性 purelin)

% BTF 训练函数默认trainlm

% (神经网络训练函数 train 梯度下降BP算法函数traingd)

% BLF 学习函数 默认learngdm

% (常用两种 梯度下降权值/阈值学习函数 learngd 梯度下降动力学习函数 learngdm)

hiddenLayerSize =4; %隐藏层神经元个数

net = newff( p_train,t_train,hiddenLayerSize,{'tansig','purelin'},'trainlm','learngd') ;

% 避免过拟合,划分训练,测试和验证数据的比例

net.layers{1}.transferFCn='logsig'%设置隐藏层'logsig'

net.layers{2}.transferFCn='purelin'%设置输出层'logsig'

net.divideParam.trainRatio =70/100; % 训练集所占总样本的比重

net.divideParam.valRatio = 20/100;% 验证集所占总样本的比重

net.divideParam.testRatio = 10/100;% 测试机所占总样本的比重

net.trainParam.lr=0.1; %学习率

net.trainParam.epochs=15000; %迭代次数

net.trainParam.goal=1e-7; %训练要求精度(缺省为0)

%% 训练网络

[net,tr] = train(net,p_train,t_train);

%% 仿真测试

f_in=x(1:end);%测试输入样本

p_test = mapminmax('apply',f_in,ps_input);

f_out = sim(net,p_test);%预测下一

%% 数据反归一化

T_sim = mapminmax('reverse',f_out,ps_output);%% 画出预测图

figure(1)

plot(1:length(T_sim),T_sim,'ro-',1:length(T_sim),data,'b*-');

legend('预测幅值','实际幅值');

xlabel('时间序列')

ylabel('幅值')

img =gcf;  %获取当前画图的句柄

print(img, '-dpng', '-r600', './运行结果1.png')         %即可得到对应格式和期望dpi的图像

figure(2)

plot(1:length(T_sim),T_sim-data,'r-');

title('误差分析')

disp('误差大小=')

mean(T_sim-data)

img =gcf;  %获取当前画图的句柄

print(img, '-dpng', '-r600', './运行结果.png')         %即可得到对应格式和期望dpi的图像

3 仿真结果

4 参考文献

[1]王金峰, 闫东伟, 鞠金艳,等. 基于经验模态分解与BP神经网络的农机总动力增长预测[J]. 农业工程学报, 2017, 33(10):7.

部分理论引用网络文献,若有侵权联系博主删除。

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,有科研问题可私信交流。

举报

相关推荐

0 条评论