时序预测

2023-11-04

时序预测 | MATLAB实CNN-LSTM(卷积长短期记忆神经网络)时间序列预测

基本介绍

本次运行测试环境MATLAB2020b

  • 深度学习方法因其具有较强的数据特征提取和拟合能力,近年来得到迅速发展,常见的深度学习模型有深度信念网络(deep belief networks,DBN)、深度受限玻尔兹曼机(restricted to beboltzmann machines,RBM)、卷积神经网络(convolutional neural networks,CNN)、长短期记忆(long-short-term memory,LSTM)网络等。目前深度学习已在图像处理、语音识别等领域取得了巨大成功。深度学习也在时空关联的数据处理上具有显著优势,尤其用于解决各种预测类问题。
  • 提出一种包含卷积神经网络和长短期记忆网络的CNN- LSTM深度神经网络模型。首先对数据进行处理,然后将处理过的数据和选定的历史数据输入到CNN-LSTM网络中,进行训练,确定模型参数,最后实现对时间序列的预测。

CNN-LSTM模型

CNN网络架构

  • CNN 网络可提取多维时间序列数据在空间结构上的关系,它主要由卷积层和池化层组成,利用局部连接、权值共享等特征大幅降低模型参数的数量、提取数据特征、加快训练速度、提高泛化性能。
  • 典型的卷积神经网络结构如图所示。其中卷积层由多个特征面组成,每个特征面由多个神经元组成,其中每个神经元通过卷积核与上一层局部的特征面区域相互连接,卷积神经网络的卷积层就是通过这样的卷积操作提取不同时间序列数据的不同特征。
  • 池化层在卷积层之后,也是由多个特征面组成,每个特征面对应其上一层的一个特征面,因而不会改变特征面的数量。池化层的作用是数据特征的二次提取,对数据进行降维,常用的池化方法有最大池化法、均值池化法等。
  • 卷积神经网络分为一维卷积、二维卷积和三维卷积,每一类都有各自的适用场景。
  • 其中一维卷积神经网络主要应用在时间序列数据上,假设其第l层是卷积层,则一维卷积的计算为:
    1
  • 对于池化层,本文采用最大池化法
    2

LSTM网络架构

  • LSTM 网络是循环神经网络(recurrent neural network,RNN)的一种,相对于传统的神经网络,RNN 网络能更好地处理时间序列问题。典型的RNN 结构如图所示。RNN 网络的传递为:3
    4
  • 传统RNN 隐含层的内部结构简单,网络对当前时刻的输入和上一时刻的输入状态未进行筛选,可能使长时间序列的关键数据信息无法传递下去,从而对预测结果造成较大偏差。LSTM 网络在隐含层内部加入输入门、输出门、遗忘门,并增加了用于存储记忆的单元,典型的LSTM 网络隐含层的内部结构如图所示。各变量之间的函数关系为:
    5
    6
    7
  • 由此可知,当输入量输入到LSTM网络隐含层后,先经过输入门经非线性变换后,与遗忘门处理过的记忆单元状态叠加,形成新的记忆单元状态,最后记忆单元状态经非线性函数处理后与经非线性函数处理的当前信息状态相点乘就可得到隐含层的输出。
  • 类似于LSTM 网络的结构,深度门控循环单元(gated recurrent unit,GRU)相比于LSTM网络内部结构减少了一个门单元和隐藏状态,取而代之的是重置门和更新门,内部结构更为简单,但对于大量数据的处理效果不如LSTM网络。

CNN-LSTM网络

  • 本文采用历史数据作为预测模型的输入,预测值作为输出。
  • 因此将1维的向量输入到CNN-LSTM 网络中。类似构造的网络结构,经测试,本文构造的CNN-LSTM网络模型参数为:
    1)一维卷积神经网络:CNN 网络包括卷积层和池化层,各层有卷积核和池化核,大小设定维度向量;激活函数都为ReLu或eLu。
    2)长短期记忆神经网络:LSTM 网络包括层单元,每一层的隐含神经元数目相应设定;激活函数可以选择ReLu或eLu。
    3)全连接层:采用单隐含层的深度神经网络作为CNNLSTM网络模型的输出层对数据进行拟合预测,输出结果为t时刻的预测值。
  • 整个CNN- LSTM 网络风功率训练预测模型如图所示。从图4可看出,CNN-LSTM 网络模型主要由两部分组成:首先输入数据经过CNN 网络,通过卷积和池化操作,实现对数据特征的提取和降维;经CNN 网络处理过的数据输入到LSTM 网络,LSTM 网络中的遗忘门、输入门和输出门通过大量数据的不断迭代训练调整自身参数,使它能从CNN 网络提取的数据信息中学习数据间的时间拟合关系,从而对预测时间序列输入输出数据进行有效的动态建模,最后通过CNN-LSTM 网络拟合训练好的数据通过全连接神经元网络输出预测值 。整个预测过程需先通过数据进行训练,确定网络模型参数。
    8
  • 对于整个CNN-LSTM 网络风功率预测模型的训练,本文采用按时间展开的反向误差传播算法(BPTT),即对神经网络按时间顺序展开为一个深层网络,然后使用误差反向传播(back propagation,BP)算法对展开后的网络进行训练。传统的梯度优化算法如随机梯度下降法(stochastic gradient descent,SGD),该算法简单、易于实现,但存在梯度消失、收敛速度较慢、难于收敛到全局最小值等缺点。针对SGD 算法的缺点,目前已提出很多改进的优化算法,如动量算法、AdaGrad、Adam 等。本文使用Adam的算法。
  • 经本文模拟试验发现,只是增加CNN-LSTM 网络模型中CNN 和LSTM网络层数量并不能有效提高预测的精度。随着神经网络层数量的增加,内部参数急剧增加,而预测的输入数据结构较为单一。
  • 因此经过大量数据的训练后,网络模型倾向于模拟训练数据的特征而缺乏预测,从而出现过拟合现象。
  • 本文使用Dropout 技术来减少模型的过拟合现象。在训练过程中,Dropout 技术将隐藏节点中的每个与其相连的输入权值以1-p的概率清零,使得这部分输入与神经元之间相连的权值在训练过程中不参与正向与反向传播,使得网络模型具有较好的防过拟合特性。

程序设计

%% CNN-LSTM时间序列预测
%% 输入参数
clc;
clear;
clearvars
% 时间滞后阶数;
Lag = 1:8;
% 训练集比例
ratio = 0.9;
% 批处理样本
MiniBatchSize =24;
% 最大迭代次数
MaxEpochs = 60;
% 学习率
learningrate = 0.005;
%% 加载数据
load data;
data = [data{:}];
%% 在训练和测试中划分顺序
% 在训练和测试中拆分数据。 
% 90%的数据用于训练,而10%的数据用于测试。 
numStepsTraining = round(ratio*numel(data));
indexTrain = 1:numStepsTraining;
dataTrain = data(indexTrain );
indexTest = numStepsTraining+1:size(data,2);
dataTest  = data(indexTest);
  • CNN-LSTM网络架构
%  创建"CNN-LSTM"模型
    layers = [...
        % 输入特征
        sequenceInputLayer([numFeatures 1 1],'Name','input')
        sequenceFoldingLayer('Name','fold')
        % CNN特征提取
        convolution2dLayer(FiltZise,32,'Padding','same','WeightsInitializer','he','Name','conv','DilationFactor',1);
        batchNormalizationLayer('Name','bn')
        eluLayer('Name','elu')
        averagePooling2dLayer(1,'Stride',FiltZise,'Name','pool1')
        % 展开层
        sequenceUnfoldingLayer('Name','unfold')
        % 平滑层
        flattenLayer('Name','flatten')
        % LSTM特征学习
        lstmLayer(128,'Name','lstm1','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        dropoutLayer(0.25,'Name','drop1')
        % LSTM输出
        lstmLayer(32,'OutputMode',"last",'Name','bil4','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        dropoutLayer(0.25,'Name','drop2')
        % 全连接层
        fullyConnectedLayer(numResponses,'Name','fc')
        regressionLayer('Name','output')    ];

    layers = layerGraph(layers);
    layers = connectLayers(layers,'fold/miniBatchSize','unfold/miniBatchSize');

预测结果

9
10
11

12

参考资料

[1] https://www.bilibili.com/video/BV1pq4y1f7kZ?spm_id_from=333.999.0.0
[2] https://mianbaoduo.com/o/bread/mbd-YZ2Zm5xs
[3] https://blog.csdn.net/kjm13182345320/article/details/118858103

致谢

  • 大家的支持是我写作的动力!
  • 感谢大家订阅,感谢,记得备注!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时序预测 的相关文章

  • 使用Rider断点调试lua代码

    记录一下 新建调试配置 在 Rider 工具栏的 Debug Config 中点击 Editor Configigurations 然后点击 号 新建一个 Emmy Debugger NEW 输入调试器名字为 Tcp Debugger co
  • Linux中cmake指定特定版本gcc

    最近因为服务器上有多个gcc 编译llvm的时候需要使用5 1以上的 但是由于默认目录 usr bin下的gcc是4 8 5 在另外的目录下有一个7 3 1的 cmake默认使用老版本的gcc 导致cmake失败 报错 输入which gc
  • websocked基础

    websocked基础 http与websocked区别 http websocked websocked特点 如何使用websocked 补充blob对象或Arraybuffer对象 http与websocked区别 http 只能由客户

随机推荐

  • cannot find reference ‘keras’ in ‘__init__.py‘

    文章目录 起因 原因 解决办法 参考来源链接 起因 在网上找了开源代码 之前看的都是jupyter notebook编写的 今天用pycharm调试一个开源程序 发现总是不能调试 检查了好几遍编译环境都没问题 运行正常 就是不能调试 报错是
  • 早期计算机语言称为,程序设计语言是软件的基础和组成部分,也称为计算机语言...

    原标题 程序设计语言是软件的基础和组成部分 也称为计算机语言 程序是对计算任务的处理对象和处理规则的描述 必须装入计算机内部才能工作 没有操作系统 系统无用 程序设计语言是软件的基础和组成部分 也称为计算机语言 定义计算机程序的语法规则 由
  • torch.nn.Linear()函数讲解

    函数讲解 in features指的是输入的二维张量的大小 即输入的 batch size size 中的size out features指的是输出的二维张量的大小 即输出的二维张量的形状为 batch size output size
  • 【Matlab】智能优化算法_灰狼优化算法GWO

    Matlab 智能优化算法 灰狼优化算法GWO 1 背景介绍 2 基本思想 2 1 等级制度 2 2 狩猎方式 3 公式推导 3 1 社会等级制度 3 2 包围猎物 3 3 包围猎物 3 4 攻击猎物 3 5 搜索猎物 4 算法流程图 5
  • 史上最详细springboot vue UEditor整合(包括遇到的各种坑)

    Vue中引入UEditor看这篇教程https blog csdn net kshon article details 102667318 接下来说说springboot中配置UEditor遇到的各种坑 1 将UEditor中目录下的con
  • IM即时通讯-推荐框架

    CIM https gitee com farsunset cim CIM是一套基于mina或netty框架下的推送系统 或许有一些企业有着自己一套即时通讯系统的需求那么CIM为您提供了一个解决方案 目前CIM支持websocket and
  • java map取第一个元素_java常用对象Map集合中关于取出元素的说明

    之前在上一篇 java常用对象API中集合框架之Map的用法 文章中简单的例举了一些Map集合中的一些简单方法和一些常用的子类 那么本章将对例举的方法和子类进行一一的详细说明和举例 这样也是为了让更多的朋友们学习java能够得到另一种启发而
  • 将手机、平板变成电脑第二屏

    将手机 平板变成电脑第二屏 过年回家了 带着大包小包 显示器总不能再带在身上吧 常年双屏使用者 当没有了双屏 感觉很难受 于是找到了开源项目deskreen Deskreen 是一款桌面应用程序 可以通过 WiFi 局域网下 将任何带有浏览
  • 华为OD机试 Python 【恢复数字序列】

    描述 给你一个由正整数拼接而成的字符串 但中间有些字符位置被打乱了 比如原来有 89101112 它可能被打乱为 90811211 这时整数10就变成了0和1两部分 请你找出原始字符串中的最小正整数是什么 输入 一行 包括被打乱的字符串和原
  • RabbitMQ 消息丢失的场景,如何保证消息不丢失?

    一 RabbitMQ消息丢失的三种情况 第一种 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候 可能数据就在半路给搞丢了 因为网络问题啥的 都有可能 第二种 RabbitMQ 弄丢了数据 MQ还没有持久化自己挂了 第三种 消
  • 【C#】.Net 腾讯云一句话识别 【实例】

    腾讯云一句话识别实例 using System using System Threading Tasks using TencentCloud Common using TencentCloud Common Profile using T
  • 编写高质量代码:改善Java程序的151个建议(第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151)...

    第10章 性能和效率 建议132 提升Java性能的基本方法 建议133 若非必要 不要克隆对象 建议134 推荐使用 望闻问切 的方式诊断性能 建议135 必须定义性能衡量标准 建议136 枪打出头鸟 解决首要系统性能问题 建议137 调
  • 素数筛【朴素,埃氏,欧拉】(持续优化ing)

    一 朴素筛法 定义部分说明 int prime 11000 存素数 int ans 0 计数 计prime数组中有多少个素数 代码实现部分 void getPrime int n prime ans 2 for int i 3 i lt n
  • Docker开发指南(自用)

    Docker开发指南 自用 本指南总结归纳菜鸟教程上的常用指令 并在文末给出了一个应用实例 序言 Docker是什么 Docker 是一个开源的应用容器引擎 基于 Go 语言 并遵从 Apache2 0 协议开源 Docker 可以让开发者
  • 【C语言练习题】计算1 * 2 * 3+3 * 4 * 5+5 * 6 * 7+...+99 * 100 * 101的值。

    计算1 2 3 3 4 5 5 6 7 99 100 101的值 错误版本 循环结束后仍执行i i 多余 include
  • 金融风控反欺诈之图算法

    先介绍下金融借贷业务流程 用户前来申请借贷 会先经过欺诈识别 把欺诈团伙和主观欺诈的个人拒绝掉 然后对通过的人做信用评估 最后根据额度模型 算出利润最大化时放款金额 刚才提到了团队欺诈 举个真实的例子 宜人贷在他们的财报中公布的 他们被一个
  • BFS和DFS代码实现

    BFS DFS实现图的遍历 以以下图数据为例 首先BFS是广度优先遍历算法 从图的某一个节点出发 然后遍历完这个节点相邻的节点 这个算法的核心就是 先把周围的找完 再去找更深的地方 通俗易懂的说法 DFS就是一条路走到底 发现没路了 返回来
  • uniapp uni-table表格组件 合并单元格

    注意 目前该方法只适用于H5 小程序和APP无法适配 就不用往下看了 解决方案 直接使用 rowspan 和 colspan 就可以 虽然文档上并没有写这些参数 但是我实际使用后以后 发现这些参数是可以直接用的 我猜测其他的一些参数都是可以
  • 软件测试V模型

    以 编码 为黄金分割线 将整个过程分为开发和测试 并且开发和测试之间是串行的关系 特点 明确标注了测试的类型 明确标注了测试阶段和开发阶段之间的对应关系 缺点 测试后置 V模型是基于瀑布模型的 将测试放在整个开发的最后阶段 没有让测试今早介
  • 时序预测

    时序预测 MATLAB实CNN LSTM 卷积长短期记忆神经网络 时间序列预测 目录 时序预测 MATLAB实CNN LSTM 卷积长短期记忆神经网络 时间序列预测 基本介绍 CNN LSTM模型 CNN网络架构 LSTM网络架构 CNN