时序预测 | MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)

news2024/9/22 13:40:32

时序预测 | MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)

目录

    • 时序预测 | MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)
      • 预测效果
      • 基本介绍
      • 程序设计
      • 参考资料

预测效果

1

2
3

基本介绍

麻雀搜索算法(Sparrow Search Algorithm, SSA)是于2020年提出的。SSA 主要是受麻雀的觅食行为和反捕食行为的启发而提出的。该算法比较新颖,具有寻优能力强,收敛速度快的优点。建立麻雀搜索算法的数学模型,主要规则如下所述:
(1)发现者通常拥有较高的能源储备并且在整个种群中负责搜索到具有丰富食物的区域,为所有的加入者提供觅食的区域和方向。在模型建立中能量储备的高低取决于麻雀个体所对应的适应度值(Fitness Value)的好坏。
(2)一旦麻雀发现了捕食者,个体开始发出鸣叫作为报警信号。当报警值大于安全值时,发现者会将加入者带到其它安全区域进行觅食。
(3)发现者和加入者的身份是动态变化的。只要能够寻找到更好的食物来源,每只麻雀都可以成为发现者,但是发现者和加入者所占整个种群数量的比重是不变的。也就是说,有一只麻雀变成发现者必然有另一只麻雀变成加入者。
(4)加入者的能量越低,它们在整个种群中所处的觅食位置就越差。一些饥肠辘辘的加入者更有可能飞往其它地方觅食,以获得更多的能量。
(5)在觅食过程中,加入者总是能够搜索到提供最好食物的发现者,然后从最好的食物中获取食物或者在该发现者周围觅食。与此同时,一些加入者为了增加自己的捕食率可能会不断地监控发现者进而去争夺食物资源。
(6)当意识到危险时,群体边缘的麻雀会迅速向安全区域移动,以获得更好的位置,位于种群中间的麻雀则会随机走动,以靠近其它麻雀。
长短期记忆网络——通常被称为 LSTM,是一种特殊的 RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。LSTM 被明确设计用来避免长期依赖性问题。长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学习的东西!
所有递归神经网络都具有神经网络的链式重复模块。在标准的 RNN 中,这个重复模块具有非常简单的结构

程序设计

  • 完整程序和数据下载方式1(资源处直接下载):MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)
  • 完整程序和数据下载方式2(订阅《LSTM长短期记忆神经网络》专栏,同时可阅读《LSTM长短期记忆神经网络》专栏收录的所有内容,数据订阅后私信我获取):MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)
  • 完整程序和数据下载方式3(订阅《智能学习》专栏,同时获取《智能学习》专栏收录程序6份,数据订阅后私信我获取):MATLAB实现SSA-LSTM、LSTM麻雀算法优化长短期记忆神经网络时间序列预测(含优化前后对比)
%% 采用ssa优化
[x ,fit_gen,process]=ssaforlstm(XTrain,YTrain,XTest,YTest);%分别对隐含层节点 训练次数与学习率寻优
%% 参数设置
pop=5; % 种群数
M=20; % 最大迭代次数
dim=4;%一共有4个参数需要优化
lb=[1   1   1  0.001];%分别对两个lstm隐含层节点 训练次数与学习率寻优
ub=[100 100 50  0.01];%这个分别代表4个参数的上下界,比如第一个参数的范围就是1-100
%初始化种群
for i = 1 : pop
    for j=1:dim
        if j==1%除了学习率 其他的都是整数
            x( i, j ) = (ub(j)-lb(j))*rand+lb(j);
        else
            x( i, j ) = round((ub(j)-lb(j))*rand+lb(j));
        end
    end
    fit( i )=fitness(x(i,:),P_train,T_train,P_test,T_test);
end
pFit = fit;
pX = x;
fMin=fit(1);
bestX = x( i, : );

for t = 1 : M
    
    [ ~, sortIndex ] = sort( pFit );% Sort.从小到大
    [fmax,B]=max( pFit );
    worse= x(B,:);
    r2=rand(1);
    %%%%%%%%%%%%%5%%%%%%这一部位为发现者(探索者)的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%
    if(r2<0.8)%预警值较小,说明没有捕食者出现
        for i = 1 : pNum  %r2小于0.8的发现者的改变(1-20% Equation (3)
            r1=rand(1);
            x( sortIndex( i ), : ) = pX( sortIndex( i ), : )*exp(-(i)/(r1*M));%对自变量做一个随机变换
            x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );%对超过边界的变量进行去除
            
            fit(  sortIndex( i ) )=fitness(x(sortIndex( i ),:),P_train,T_train,P_test,T_test);
        end
    else   %预警值较大,说明有捕食者出现威胁到了种群的安全,需要去其它地方觅食
        for i = 1 : pNum   %r2大于0.8的发现者的改变
            x( sortIndex( i ), : ) = pX( sortIndex( i ), : )+randn(1)*ones(1,dim);
            x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
            
            fit(  sortIndex( i ) )=fitness(x(sortIndex( i ),:),P_train,T_train,P_test,T_test);
            
        end
        
    end
    [ ~, bestII ] = min( fit );
    bestXX = x( bestII, : );
    %%%%%%%%%%%%%5%%%%%%这一部位为加入者(追随者)的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%
    for i = ( pNum + 1 ) : pop     %剩下20-100的个体的变换                % Equation (4)
        %         i
        %         sortIndex( i )
        A=floor(rand(1,dim)*2)*2-1;
        if( i>(pop/2))%这个代表这部分麻雀处于十分饥饿的状态(因为它们的能量很低,也是是适应度值很差),需要到其它地方觅食
            x( sortIndex(i ), : )=randn(1,dim).*exp((worse-pX( sortIndex( i ), : ))/(i)^2);
        else%这一部分追随者是围绕最好的发现者周围进行觅食,其间也有可能发生食物的争夺,使其自己变成生产者
            x( sortIndex( i ), : )=bestXX+(abs(( pX( sortIndex( i ), : )-bestXX)))*(A'*(A*A')^(-1))*ones(1,dim);
        end
        x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );%判断边界是否超出
        fit(  sortIndex( i ) )=fitness(x(sortIndex( i ),:),P_train,T_train,P_test,T_test);
    end
    %%%%%%%%%%%%%5%%%%%%这一部位为意识到危险(注意这里只是意识到了危险,不代表出现了真正的捕食者)的麻雀的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%
    c=randperm(numel(sortIndex));%%%%%%%%%这个的作用是在种群中随机产生其位置(也就是这部分的麻雀位置一开始是随机的,意识到危险了要进行位置移动,
    %处于种群外围的麻雀向安全区域靠拢,处在种群中心的麻雀则随机行走以靠近别的麻雀)
    b=sortIndex(c(1:pop));
    for j =  1  : length(b)      % Equation (5)
        if( pFit( sortIndex( b(j) ) )>(fMin) ) %处于种群外围的麻雀的位置改变
            x( sortIndex( b(j) ), : )=bestX+(randn(1,dim)).*(abs(( pX( sortIndex( b(j) ), : ) -bestX)));
        else
            %处于种群中心的麻雀的位置改变
            x( sortIndex( b(j) ), : ) =pX( sortIndex( b(j) ), : )+(2*rand(1)-1)*(abs(pX( sortIndex( b(j) ), : )-worse))/ ( pFit( sortIndex( b(j) ) )-fmax+1e-50);
        end
        x( sortIndex(b(j) ), : ) = Bounds( x( sortIndex(b(j) ), : ), lb, ub );
        fit(  sortIndex( b(j)  ) )=fitness(x(sortIndex( b(j) ),:),P_train,T_train,P_test,T_test);
        
    end

参考资料

[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
[3] https://blog.csdn.net/article/details/126043107?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis最新版本安装教程——Linux操作系统(Centos7)

Redis是基于C语言编写的&#xff0c;因此首先需要安装Redis所需要的gcc依赖&#xff1a; yum install -y gcc tcl 下载安装包并解压 Redis的官方网站地址&#xff1a;RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cach…

【前端下载文件流详解】前端实现多种类型文件(word,excel,pdf,rar,zip等)的下载,接口返回文件流形式(附源码)

【写在前面】其实之前我也写了有关java实现文件的下载&#xff0c;但是当时是局限于excel文档&#xff0c;针对其他类型的并没有介绍&#xff0c;这次刚好有个客户现场反馈回来的&#xff0c;说我们系统确实能下载报告&#xff0c;但是甲方领导要看所有的报告&#xff0c;这不我…

【持续升级】Vue3 系统入门与项目实战无密分享闻郎江上唱歌声

Vue3 系统入门指南&#xff1a;开发高效、可维护的Web应用 【持续升级】Vue3 系统入门与项目实战 下栽のke呈&#xff1a;https://www.666xit.com/3811/ Vue.js是目前最流行的JavaScript框架之一&#xff0c;它的最新版本Vue3已经发布。Vue3具有更好的性能和可维护性&#x…

HNU数据结构与算法分析-小班6

HNU数据结构与算法分析-小班6

一文带你入门MySQL

目录 一、MySQL登陆1.配置MySQL环境变量2.MySQL登陆命令 二、MySQL基础知识1.数据类型&#xff08;1&#xff09;整型&#xff08;2&#xff09;浮点型&#xff08;3&#xff09;日期型&#xff08;4&#xff09;字符型&#xff08;5&#xff09;数据类型小结 2.MySQL的约束【重…

​力扣解法汇总1105. 填充书架

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第…

【c语言习题】return中途结束 函数调用

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

王道计组(23版)6_总线

总线概述 特点 分时&#xff1a;同一时刻只允许一个部件向总线发送信息 共享&#xff1a;总线上可以挂接多个部件&#xff0c;各个部件互相交换的信息都可以通过这组线路分时共享&#xff0c;多个部件可以同时从总线接收相同的信息 分类 片内总线&#xff1a;CPU芯片内部AL…

如何实现延时任务(订单到期关闭)

目录 一、被动关闭 二、定时任务 三、JDK自带的DelayQueue 四、Netty的时间轮 五、Kafka的时间轮 六、RocketMQ延迟消息 七、RabbitMQ死信队列 八、RabbitMQ插件 九、Redis过期监听 十、Redis的zset 十一、Redisson Redis 总结 在电商、支付等系统中&#xff0c;…

【某软件消息的加解密分析】

首先来熟悉一下ida的使用。 首先找到打开ida&#xff0c;点击"debugger"-> “run” -> “local windows debugger"后&#xff0c;从Application中找到程序并点击"ok”&#xff0c;程序停在入口处。 因为我们要调试的是接收数据包的加解密过程&…

MIT6.S081操作系统实验2021(xv6系统)——lab1 Xv6 and Unix utilities

MIT6.S081操作系统实验2021——lab1 参考文章 sleep 要求为xv6实现UNIX 程序sleep&#xff1b;其应该暂停用户指定的ticks number。tick是 xv6 内核定义的时间概念&#xff0c;即计时器芯片的两次中断之间的时间&#xff08;两次时钟中断之间的时间&#xff09;。您的解决方…

从服务员到高级测试工程师,我的坎坷之路谁又能懂

首先要感谢那些嘲讽我代码写的烂的人&#xff0c;五年开发经验嘲笑刚出校门踏入社会的我&#xff0c;让我放弃了开发工作&#xff0c;走向测试的康庄大道。此外&#xff0c;曾经的开发经验对我测试工作的帮助是无与伦比的。数据库&#xff0c;编程语言&#xff0c;liunx&#x…

Linux驱动开发——高级I/O操作(五)

目录 mmap设备文件操作 定位操作 习题 mmap设备文件操作 显卡一类的设备有一片很大的显存&#xff0c;驱动程序将这片显存映射到内核的地址空间&#xff0c;方便进行操作。如果用户想要在屏幕上进行绘制操作&#xff0c;将要在用户空间开辟出一片至少一样大的内存&#xff…

Python学习之DateTime、TimeDelta、Strftime(Format)及其示例

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤1.引入库2.使用date.today()打印日期3.Python当前日期和时间&#xff1a;now() today()总结 4.如何使用 Strftime()格式化日期和时间输出1. 首先&#xff0c;我们将看到一个简单的如何格式化年份的步骤。通过一个例子来理…

使用buildroot编译完整系统【IMX6ULLPRO】

目录 构建 IMX6ULL Pro 版的根文件系统 编译系统 ​编辑 镜像文件 构建 IMX6ULL Pro 版的根文件系统 配置文件说明 编译系统 下面以 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig 配置文 件为例&#xff0c;在 ubuntu 终端上说明 Buildroot 的配置过程&#x…

玩转ChatGPT:辅助编程

一、写在前面 首先让小Chat介绍自己在编程方面的天赋&#xff1a; 总结起来&#xff1a;TA掌握了海量的编程知识&#xff0c;能做到自动代码生成、代码审查优化、编程教学辅导以及实时问题解答。我问TA学习了多少案例&#xff0c;TA说&#xff1a;忘了&#xff0c;但保证够用。…

OpenCV-手势语言识别

OpenCV-手势语言识别 OpenCV-手势语言识别Python环境、TensorFlow环境设置直方图模型保存set_hand_hist.py相关代码如下&#xff1a;载入手势图片 OpenCV-手势语言识别 本部分包括Python环境、TensorFlow环境和OpenCV-Python环境。 Python环境、TensorFlow环境 需要Python 3…

Spring Boot-入门、热部署、配置文件、静态资源

Spring Boot Spring Boot概述 一、微服务概述 1、微服务 微服务&#xff08;Microservices&#xff09;是一种软件架构风格。微服务是以专注单一责任与功能的小型功能区块 &#xff08;Small Building Blocks&#xff09;为基础&#xff1b;利用模块化的方式组合出复杂的大…

DockerImage镜像版本说明

参考文章 1、https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences-in-docker-62171ed4531d 2、https://stackoverflow.com/questions/52083380/in-docker-image-names-what-is-the-difference-between-alpine-jessie-stret…

顺序表 和 链表 的区别

顺序表 基于数组 就是对数组进行相关的操作 进行存储数据 数组有个很大的缺点就是 可能会产生内存浪费 针对数组这一缺点 就产生了链表 链表顾名思义 就是像链条一样将数据串起来 链表是将内存中的小空间利用起来 让内存的利用率提高 但是也产生了很大的缺点 就是不能随…