时序预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预测

2023-09-15 18:52:04

时序预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预测

预测效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

基本介绍

MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预测(完整源码和数据)
1.data为数据集,单变量时间序列。
2.MainNGOLSTMTS.m为程序主文件,其他为函数文件无需运行。
3.命令窗口输出MAE、MSE、RMSEP、R^2、RPD和MAPE,可在下载区获取数据和程序内容。
4.北方苍鹰算法优化参数为学习率,隐藏层节点个数,正则化参数。
注意程序和数据放在一个文件夹,运行环境为Matlab2018及以上.

程序设计

%% --------------LSTM优化----------------------
% 参数设置
SearchAgents = 5;  % 种群数量 
Max_iterations =10; % 迭代次数  

lowerbound = [1e-10 0.0001 10 ];%三个参数的下限
upperbound = [1e-2 0.002 400 ];%三个参数的上限
dim = 3;%数量,即要优化的LSTM超参数个数
 
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)     %输入层,参数是输入特征维数
    lstmLayer(NumOfUnits)        %学习层,隐含层神经元的个数
    dropoutLayer(0.2)                  %权重丢失率
    fullyConnectedLayer(outputSize)   %全连接层,也就是输出的维数
    regressionLayer];    %回归层,该参数说明是在进行回归问题,而不是分类问题

% trainoption(lstm)
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

更多推荐

C | atexit函数

C|atexit函数文章目录C|atexit函数atexit区别进程终止的方式Reference欢迎关注公众号“三戒纪元”atexitmain函数是整个程序的入口,但是其实可以在内核中可以使用链接器来设置程序的开始地方。当内核使用⼀个exec函数执行C程序时,在调⽤main函数之前先调用⼀个特殊的启动例程,可执行程序将

安装ThinkPHP5.1并在框架中使用FFmpeg视频处理工具遇到的问题和解决办法

一:安装ThinkPHP5.1框架问题一:安装方法有很多,我这里使用composer安装的,但是遇到了问题,出现了报错安装方法可是查看https://www.kancloud.cn/manual/thinkphp5_1/353948composercreate-projecttopthink/thinkblog5.1.

objList=strList为什么报错

代码复现先看下面一段代码List<String>strList=newArrayList<>();List<Object>objList=strList;//报错乍一看好像没什么问题,但为什么追报错呢?先别急,看下面一段代码List<Integer>intList=newArrayList<>();List<Objec

负载均衡策略

一台机器不能满足,则增加两台或者多台机器,共同承担访问压力,这就是典型的集群和负载均衡架构。一、轮询(RoundRobin)按照顺序将请求依次分配给每个服务器,确保每个服务器都能平均分担负载。二、哈希(IPHash)根据客户端的IP地址将请求分配给服务器,这会通过哈希函数来分配应用服务器。相同IP的客户端将始终被分配到

【 2023华为杯C题】大规模创新类竞赛评审方案研究(思路、代码......)

目录1题目概述2问题3极差的定义及标准分的计算方法4题目及数据下载5思路、代码下载......1题目概述现在创新类竞赛很多,其中规模较大的竞赛,一般采用两阶段(网评、现场评审)或三阶段(网评、现场评审和答辩)评审。创新类竞赛的特点是没有标准答案,需要评审专家根据命题人(组)提出的评审框架(建议)独立评审。所以,对同一份

凹凸贴图和法线贴图的区别

1、什么是凹凸贴图凹凸贴图(bumpmapping)是一种计算机图形学中的渲染技术,用于在给定的表面上模拟微小的凹凸纹理。通过在表面法线方向上微调每个像素的光照值,可以给平滑的表面增加视觉上的凹凸感。在凹凸贴图中,每个像素点都包含了一个法线向量,表示该点表面的方向。这些法线向量通常以纹理的形式存储在一个称为凹凸贴图的二

Zabbix“专家坐诊”第204期问答汇总

问题一Q:请问自动发现如何配置?A:在Zabbix中配置自动发现,可以使用以下步骤:登录到Zabbix的Web界面。确保您具有管理员或具有适当权限的用户角色。导航到“配置”菜单,然后选择“自动发现”。点击“创建自动发现”按钮。在“名称”字段中,输入自动发现规则的名称。在“新发现设备”字段中,选择要在自动发现过程中创建设

【Python】PySpark 数据处理 ② ( 安装 PySpark | PySpark 数据处理步骤 | 构建 PySpark 执行环境入口对象 )

文章目录一、安装PySpark1、使用pip安装PySpark2、国内代理镜像3、PyCharm中安装PySpark二、PySpark数据处理步骤三、构建PySpark执行环境入口对象四、代码示例一、安装PySpark1、使用pip安装PySpark执行Windows+R,运行cmd命令行提示符,在命令行提示符终端中,

计算机网络篇之IPV4数据报格式

计算机网络篇之IPV4数据报格式structiphdr{uint8_tversion:4;//4位版本字段表示Internet标头的格式,ipv4值是4uint8_tihl:4;//4位因特网报头长度,ip报头中32位字的数量uint8_ttos;//服务类型字段,该字段传达IP数据报的服务质量,源于第一个IP规范,在

【从0学习Solidity】 3. 函数详解

【从0学习Solidity】3.函数详解博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没饭吃的学习汇报系列,大家有兴趣的

SpringBoot整合Activiti7——代理/候选人/候选组(四)

文章目录一、代理人二、候选人三、候选组四、组任务办理流程五、UEL表达式UEL-valueUEL-methodUELmethod结合value一、代理人一个用户任务只允许有一个代理人。为一个任务分配代理人后act_ru_task表的ASSIGNEE_字段会被设置为响应的值。审批任务设置assignee变量,表示是该任务

热文推荐