时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测
目录
- 时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测
- 预测效果
- 基本介绍
- 程序设计
- 参考资料
预测效果
基本介绍
时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测(完整源码和数据)
1.data为数据集,单变量时间序列。
2.MainNGOBiLSTMTS.m为程序主文件,其他为函数文件无需运行。
3.命令窗口输出MAE、MSE、RMSEP、RPD和MAPE,可在下载区获取数据和程序内容。
4.北方苍鹰算法优化参数为学习率,隐藏层节点个数,正则化参数。
注意程序和数据放在一个文件夹,运行环境为Matlab2018及以上.
程序设计
- 完整程序和数据下载方式(资源处直接下载):MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测
%% -------------优化----------------------
% 参数设置
SearchAgents = 5; % 种群数量
Max_iterations =10; % 迭代次数
lowerbound = [1e-10 0.0001 10 ];%三个参数的下限
upperbound = [1e-2 0.002 400 ];%三个参数的上限
dim = 3;%数量,即要优化的超参数个数
fobj = @(x)fun(x,inputn_train,outputn_train,outputps); %调用函数fun计算适应度函数值
%% 赋值;
[Best_score,Best_pos,Convergence_curve]=NGO(SearchAgents,Max_iterations,lowerbound,upperbound,dim,fobj) %% 北方苍鹰算法
%得到最优参数
L2Regularization = Best_pos(1,1); % 最佳L2正则化系数
InitialLearnRate = Best_pos(1,2); % 最佳初始学习率
NumOfUnits =abs(round( Best_pos(1,3))); % 最佳隐藏层节点数
%% ------------------利用优化参数重新训练LSTM并预测----------------------------
% 数据输入x的特征维度
inputSize = size(inputn_train,1);
% 数据输出y的维度
outputSize = size(outputn_train,1);
% 设置网络结构
layers = [ ...
sequenceInputLayer(inputSize) %输入层,参数是输入特征维数
dropoutLayer(0.2) %权重丢失率
fullyConnectedLayer(outputSize) %全连接层,也就是输出的维数
regressionLayer]; %回归层,该参数说明是在进行回归问题,而不是分类问题
opts = trainingOptions('adam', ... %优化算法
'MaxEpochs',100, ... %最大迭代次数
'GradientThreshold',1,... %梯度阈值,防止梯度爆炸
'ExecutionEnvironment','cpu',... %对于大型数据集合、长序列或大型网络,在 GPU 上进行预测计算通常比在 CPU 上快。其他情况下,在 CPU 上进行预测计算通常更快。
'InitialLearnRate',InitialLearnRate, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',120, ...
'LearnRateDropFactor',0.2, ... % 指定初始学习率 0.005,在 100 轮训练后通过乘以因子 0.2 来降低学习率。
'L2Regularization', L2Regularization, ... % 正则化参数
'Verbose',false, ... %如果将其设置为true,则有关训练进度的信息将被打印到命令窗口中。
'Plots','training-progress'... %构建曲线图, 若将'training-progress'替换为'none',则不画出曲线
); % 'MiniBatchSize',outputSize*30, ...
% 训练
LSTMnet = trainNetwork(inputn_train ,outputn_train ,layers,opts); % 网络训练
% 预测
[LSTMnet,LSTMoutputr_train]= predictAndUpdateState(LSTMnet,inputn_train); % 训练样本拟合值
LSTMoutput_train = mapminmax('reverse',LSTMoutputr_train,outputps); % 数据反归一化
%网络测试输出
LSTMoutputr_test= [];
end
LSTMoutput_test= mapminmax('reverse',LSTMoutputr_test,outputps); %反归一化
toc
%% -----------------预测结果-------------------------
% 数据格式转换
LSTM_train =LSTMoutput_train';
LSTM_test = LSTMoutput_test';
train_DATA=output_train'; %训练样本标签
test_DATA= output_test'; %测试样本标签
%% 绘图
%% 均方根误差 RMSE
error1 = sqrt(sum((LSTM_train - train_DATA).^2)./M);
error2 = sqrt(sum((LSTM_test- test_DATA).^2)./N);
%%
%决定系数
R1 = 1 - norm(train_DATA - LSTM_train)^2 / norm(train_DATA - mean(train_DATA))^2;
R2 = 1 - norm(test_DATA - LSTM_test)^2 / norm(test_DATA - mean(test_DATA ))^2;
%%
%均方误差 MSE
mse1 = sum((LSTM_train - train_DATA).^2)./M;
mse2 = sum((LSTM_test - test_DATA).^2)./N;
%%
%RPD 剩余预测残差
SE1=std(LSTM_train-train_DATA);
RPD1=std(train_DATA)/SE1;
SE=std(LSTM_test-test_DATA);
RPD2=std(test_DATA)/SE;
%% 平均绝对误差MAE
MAE1 = mean(abs(train_DATA - LSTM_train));
MAE2 = mean(abs(test_DATA - LSTM_test));
%% 平均绝对百分比误差MAPE
MAPE1 = mean(abs((train_DATA - LSTM_train)./train_DATA));
MAPE2 = mean(abs((test_DATA - LSTM_test)./test_DATA));
参考资料
[1] https://blog.csdn.net/article/details/126072792?spm=1001.2014.3001.5502
[2] https://blog.csdn.net/article/details/126044265?spm=1001.2014.3001.5502