【Matlab深度学习】详解matlab深度学习进行时间序列预测

🔗 运行环境:Matlab

🚩 撰写作者:左手の明天

🥇 精选专栏:《python》

🔥  推荐专栏:《算法研究》

🔐#### 防伪水印——左手の明天 ####🔐

💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗

💗今天分享Matlab深度学习 —— 时间序列预测💗

📆  最近更新:2024 年 03 月 03日,左手の明天的第 316 篇原创博客

📚 更新于专栏:机器学习

🔐#### 防伪水印——左手の明天 ####🔐


一、LSTM 网络

LSTM 网络是一种循环神经网络 (RNN),它通过遍历时间步并更新 RNN 状态来处理输入数据。RNN 状态包含在所有先前时间步中记住的信息。可以使用 LSTM 神经网络,通过将先前的时间步作为输入来预测时间序列或序列的后续值。要为时间序列预测训练 LSTM 神经网络,训练具有序列输出的回归 LSTM 神经网络,其中响应(目标)是将值移位了一个时间步的训练序列。也就是说,在输入序列的每个时间步,LSTM 神经网络都学习预测下一个时间步的值。

有两种预测方法:开环预测和闭环预测。

  • 开环预测仅使用输入数据预测序列中的下一个时间步。对后续时间步进行预测时,需要从数据源中收集真实值并将其用作输入。例如,假设要使用时间步 1 到 t−1 中收集的数据来预测序列的时间步 t 的值。要对时间步 t+1 进行预测,等到记录下时间步 t 的真实值,并将其用作输入进行下一次预测。在进行下一次预测之前,如果有可以提供给 RNN 的真实值,则请使用开环预测。

  • 闭环预测通过使用先前的预测作为输入来预测序列中的后续时间步。在这种情况下,模型不需要真实值便可进行预测。例如,假设要仅使用在时间步 1 至 t−1 中收集的数据来预测序列的时间步 t 至 t+k 的值。要对时间步 i 进行预测,使用时间步 i−1 的预测值作为输入。使用闭环预测来预测多个后续时间步,或在进行下一次预测之前没有真实值可提供给 RNN 时使用闭环预测。

此图显示使用闭环预测的预测值的序列示例。

此示例使用 Waveform 数据集,它包含生成的 2000 个不同长度的合成波形,有三个通道。该示例训练一个 LSTM 神经网络,以同时使用闭环和开环预测根据先前时间步提供的值来预测波形的将来值。


二、matlab时间序列预测

2.1 加载数据

从 WaveformData.mat 加载示例数据。数据是序列的 numObservations×1 元胞数组,其中 numObservations 是序列数。每个序列都是一个 numChannels×-numTimeSteps 数值数组,其中 numChannels 是序列的通道数,numTimeSteps 是序列的时间步数。

load WaveformData

查看前几个序列的大小。

data(1:5)
ans=5×1 cell array{3×103 double}{3×136 double}{3×140 double}{3×124 double}{3×127 double}

查看通道数。为了训练 LSTM 神经网络,每个序列必须具有相同数量的通道。

numChannels = size(data{1},1)
numChannels = 3

可视化绘图中的前几个序列。

figure
tiledlayout(2,2)
for i = 1:4nexttilestackedplot(data{i}')xlabel("Time Step")
end

将数据划分为训练集和测试集。将 90% 的观测值用于训练,其余的用于测试。

numObservations = numel(data);
idxTrain = 1:floor(0.9*numObservations);
idxTest = floor(0.9*numObservations)+1:numObservations;
dataTrain = data(idxTrain);
dataTest = data(idxTest);

2.2 准备要训练的数据

要预测序列在将来时间步的值,请将目标指定为将值移位了一个时间步的训练序列。也就是说,在输入序列的每个时间步,LSTM 神经网络都学习预测下一个时间步的值。预测变量是没有最终时间步的训练序列。

for n = 1:numel(dataTrain)X = dataTrain{n};XTrain{n} = X(:,1:end-1);TTrain{n} = X(:,2:end);
end

为了更好地拟合并防止训练发散,请将预测变量和目标值归一化为零均值和单位方差。在进行预测时,还必须使用与训练数据相同的统计量对测试数据进行归一化。要轻松计算所有序列的均值和标准差,请在时间维度中串联这些序列。

muX = mean(cat(2,XTrain{:}),2);
sigmaX = std(cat(2,XTrain{:}),0,2);muT = mean(cat(2,TTrain{:}),2);
sigmaT = std(cat(2,TTrain{:}),0,2);for n = 1:numel(XTrain)XTrain{n} = (XTrain{n} - muX) ./ sigmaX;TTrain{n} = (TTrain{n} - muT) ./ sigmaT;
end

2.3 定义 LSTM 神经网络架构

创建一个 LSTM 回归神经网络。

  • 使用输入大小与输入数据的通道数匹配的序列输入层。

  • 接下来,使用一个具有 128 个隐藏单元的 LSTM 层。隐藏单元的数量确定该层学习了多少信息。使用更多隐藏单元可以产生更准确的结果,但也更有可能导致训练数据过拟合。

  • 要输出通道数与输入数据相同的序列,请包含一个输出大小与输入数据通道数匹配的全连接层。

  • 最后,包括一个回归层。

layers = [sequenceInputLayer(numChannels)lstmLayer(128)fullyConnectedLayer(numChannels)regressionLayer];

2.4 指定训练选项

指定训练选项。

  • 使用 Adam 优化进行训练。

  • 进行 200 轮训练。对于较大的数据集,您可能不需要像良好拟合那样进行这么多轮训练。

  • 在每个小批量中,对序列进行左填充,使它们具有相同的长度。左填充可以防止 RNN 预测序列末尾的填充值。

  • 每轮训练都会打乱数据。

  • 在绘图中显示训练进度。

  • 禁用详尽输出。

options = trainingOptions("adam", ...MaxEpochs=200, ...SequencePaddingDirection="left", ...Shuffle="every-epoch", ...Plots="training-progress", ...Verbose=0);

2.5 训练循环神经网络

使用 trainNetwork 函数以指定的训练选项训练 LSTM 神经网络。

net = trainNetwork(XTrain,TTrain,layers,options);

2.6 测试循环神经网络

使用与训练数据相同的步骤准备用于预测的测试数据。

使用从训练数据计算出的统计量来归一化测试数据。将目标指定为值移位了一个时间步的测试序列,将预测变量值指定为没有最终时间步的测试序列。

for n = 1:size(dataTest,1)X = dataTest{n};XTest{n} = (X(:,1:end-1) - muX) ./ sigmaX;TTest{n} = (X(:,2:end) - muT) ./ sigmaT;
end

使用测试数据进行预测。指定与训练相同的填充选项。

YTest = predict(net,XTest,SequencePaddingDirection="left");

为了计算准确度,对于每个测试序列,请计算预测和目标之间的均方根误差 (RMSE)。

for i = 1:size(YTest,1)rmse(i) = sqrt(mean((YTest{i} - TTest{i}).^2,"all"));
end

在直方图中可视化误差。值越低,表示准确度越高。

figure
histogram(rmse)
xlabel("RMSE")
ylabel("Frequency")

计算所有测试观测值的 RMSE 均值。

mean(rmse)
ans = single0.5080

2.7 预测将来时间步

给定输入时间序列或序列,要预测多个将来时间步的值,请使用 predictAndUpdateState 函数一次预测一个时间步,并在每次预测时更新 RNN 状态。对于每次预测,使用前一次预测作为函数的输入。

在绘图中可视化其中一个测试序列。

idx = 2;
X = XTest{idx};
T = TTest{idx};figure
stackedplot(X',DisplayLabels="Channel " + (1:numChannels))
xlabel("Time Step")
title("Test Observation " + idx)

开环预测

开环预测仅使用输入数据预测序列中的下一个时间步。对后续时间步进行预测时,需要从数据源中收集真实值并将其用作输入。例如,假设您要使用时间步 1 到 t−1 中收集的数据来预测序列的时间步 t 的值。要对时间步 t+1 进行预测,请等到记录下时间步 t 的真实值,并将其用作输入进行下一次预测。在进行下一次预测之前,如果有可以提供给 RNN 的真实值,则请使用开环预测。

首先使用 resetState 函数重置状态来初始化 RNN 状态,然后使用输入数据的前几个时间步进行初始预测。使用输入数据的前 75 个时间步更新 RNN 状态。

net = resetState(net);
offset = 75;
[net,~] = predictAndUpdateState(net,X(:,1:offset));

要进行进一步的预测,请遍历时间步并使用 predictAndUpdateState 函数更新 RNN 状态。通过遍历输入数据的时间步并将其用作 RNN 的输入,预测测试观测值的其余时间步的值。第一个预测是对应于时间步 offset + 1 的值。

numTimeSteps = size(X,2);
numPredictionTimeSteps = numTimeSteps - offset;
Y = zeros(numChannels,numPredictionTimeSteps);for t = 1:numPredictionTimeStepsXt = X(:,offset+t);[net,Y(:,t)] = predictAndUpdateState(net,Xt);
end

将预测值与目标值进行比较。

figure
t = tiledlayout(numChannels,1);
title(t,"Open Loop Forecasting")for i = 1:numChannelsnexttileplot(T(i,:))hold onplot(offset:numTimeSteps,[T(i,offset) Y(i,:)],'--')ylabel("Channel " + i)
endxlabel("Time Step")
nexttile(1)
legend(["Input" "Forecasted"])

闭环预测

闭环预测通过使用先前的预测作为输入来预测序列中的后续时间步。在这种情况下,模型不需要真实值便可进行预测。例如,假设您要仅使用在时间步 1 至 t−1 中收集的数据来预测序列的时间步 t 至 t+k 的值。要对时间步 i 进行预测,请使用时间步 i−1 的预测值作为输入。使用闭环预测来预测多个后续时间步,或在进行下一次预测之前没有真实值可提供给 RNN 时使用闭环预测。

首先使用 resetState 函数重置状态来初始化 RNN 状态,然后使用输入数据的前几个时间步进行初始预测 Z。使用输入数据的所有时间步更新 RNN 状态。

net = resetState(net);
offset = size(X,2);
[net,Z] = predictAndUpdateState(net,X);

要进行进一步的预测,请遍历时间步并使用 predictAndUpdateState 函数更新 RNN 状态。通过将先前的预测值迭代传递给 RNN 来预测接下来的 200 个时间步。由于 RNN 不需要输入数据来进行任何进一步的预测,因此可以指定任意数量的时间步来进行预测。

numPredictionTimeSteps = 200;
Xt = Z(:,end);
Y = zeros(numChannels,numPredictionTimeSteps);for t = 1:numPredictionTimeSteps[net,Y(:,t)] = predictAndUpdateState(net,Xt);Xt = Y(:,t);
end

在绘图中可视化预测值。

numTimeSteps = offset + numPredictionTimeSteps;figure
t = tiledlayout(numChannels,1);
title(t,"Closed Loop Forecasting")for i = 1:numChannelsnexttileplot(T(i,1:offset))hold onplot(offset:numTimeSteps,[T(i,offset) Y(i,:)],'--')ylabel("Channel " + i)
endxlabel("Time Step")
nexttile(1)
legend(["Input" "Forecasted"])

闭环预测允许您预测任意数量的时间步,但与开环预测相比,其准确度可能会降低,因为 RNN 在预测过程中不会访问真实值。


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

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

相关文章

力扣——盛最多水的容器

题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:…

最短路径(2.19)

目录 1.网络延迟时间 弗洛伊德算法 迪杰斯特拉算法 2. K 站中转内最便宜的航班 3.从第一个节点出发到最后一个节点的受限路径数 4.到达目的地的方案数 1.网络延迟时间 有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的…

day32贪心算法 part02

贪心系列的时候,题目和题目之间貌似没有什么联系,是真的就是没什么联系,因为贪心无套路,没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维。贪心只是一类题的统称,并没有什么固定套路。 122. 买卖…

Android NDK底层BUG,记录:connect、socket(AF_INET, SOCK_STREAM, 0) 等系统套接字接口函数崩溃问题。

在 Android NDK 之中,看上去调用 connect、socket 函数是不会崩溃的,但这是否定的,它在特定的情况下存在必定的崩溃的问题。 但是这种情况放到MACOS、LINUX、WINDOWS都不会崩溃,而它崩溃的点出现在操作系统底层。 人们需要参考这…

香橙派企业信用问题-劝一个是一个,别买!!!

1. 背景 香橙派推广旗下AI PRO 开发板,在B站做直播,一场直播两个直播间,分别抽取一名观众,宣传是场场送AI PRO开发板!!! 2. 收到奖品与宣传不符合 3.咨询群主:态度很傲慢&#xff0c…

MES的生产计划管理与ERP的生产计划管理到底有什么不同?

在制造业信息化的道路上,ERP系统和MES系统是两个非常重要的信息化管理工具。大多数制造业企业往往首先考虑上ERP系统,经过一段时间的深度使用后,再引进MES系统进行报工或数采。但我们可以发现,这两个系统都能进行生产管理&#xf…

详细了解网络通信流程、协议组成、编码方式、数据传输方式和途径、Http 协议的编码、cookie的使用和提取路径

详细了解网络通信流程、协议组成、编码方式、数据传输方式和途径、Http 协议的编码、cookie的使用和提取路径。 一、网络通信简介 现代的网络传输介质以以太网链路居多,完整的网络数据报结构大致如下。传输层及其以下的机制由操作系统内核提供,应用层由用户进程提供,应用程…

上位机图像处理和嵌入式模块部署(qmacvisual学习1)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 虽然我们前面学习了很多的知识点,比如说在windows这边,用qt写界面,用opencv写图像处理代码;在linux…

二维码门楼牌管理系统技术服务:构建智慧城市的基石

文章目录 前言一、标准地址设置规则二、门楼牌作为标准地址的法定载体三、二维码门楼牌管理系统技术服务的优势与应用前景 前言 在智慧城市建设的浪潮中,二维码门楼牌管理系统技术服务以其高效、便捷的特性,逐渐成为城市管理的重要工具。本文将深入探讨…

一张草图直接生成视频游戏,谷歌推出生成交互大模型

谷歌DeepMind的研究人员推出了,首个无需数据标记、无监督训练的生成交互模型——Generative Interactive Environments,简称“Genie”。 Genie有110亿参数,可以根据图像、真实照片甚至草图,就能生成各种可控制动作的视频游戏。Ge…

项目可行性方案:人脸识别实现无感考勤的项目技术可行性方案

目 录 1.引言 1.1编写目的 1.2背景 2.可行性研究的前提 2.1要求 2.2目标 3.对现有系统的分析 3.1系统改进示意图 3.2改进之处 3.3技术条件方面的可行性 4.结论 1.引言 1.1编写目的 本报告编写的目的是探究学校里对教室和办公室内教师的人脸进行识别从而…

Linux --- 应用层 | HTTP | HTTPS

前言 前面写的TCP/UDP客户端在访问服务端的时候,需要输入ip地址和端口号才可以访问, 但在现实中,我们访问一个网站是直接输入的一个域名,而不是使用的ip地址端口号。 比如在访问百度 https://www.baidu.com/的时候, …

2024最新AI系统ChatGPT网站源码, AI绘画系统

一、前言说明 R5Ai创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GP…

CVE-2024-23334 AIOHTTP 目录遍历漏洞分析

漏洞描述: aiohttp 是一个用于 asyncio 和 Python 的异步 HTTP 客户端/服务器框架。使用aiohttp作为Web服务器并配置静态路由时,需要指定静态文件的根路径。此外,选项“follow_symlinks”可用于确定是否遵循静态根目录之外的符号链接。当“f…

css样式元素的相对定位,绝对定位,固定定位等元素定位运用技巧详解

文章目录 1.相对定位 relative2.绝对定位 absolute3.固定定位4.display 转换元素5.float浮动6.float产生内容塌陷问题7.overflow CSS样式学习宝典,关注点赞加收藏,防止迷路哦 在CSS中关于定位的内容是:position:relative | absolute | static…

Unreal触屏和鼠标控制旋转冲突问题

Unreal触屏和鼠标控制旋转冲突问题 鼠标控制摄像机旋转添加Input轴计算旋转角度通过轴事件控制旋转 问题和原因问题原因 解决办法增加触摸控制旋转代码触屏操作下屏蔽鼠标轴响应事件 鼠标控制摄像机旋转 通过Mouse X和Mouse Y控制摄像机旋转。 添加Input轴 计算旋转角度 通过…

SpringBootWeb快速入门

1.创建springboot工程,新建module 2.勾选web开发相关依赖 3.删除多余文件 4.新建类 5.启动类中运行main方法 6.启动 默认端口号8080 7.打开浏览器,地址栏输入 8.报错 9.原因,控制层位置放错,剪切controller层放进com.example …

[vue error] TypeError: Components is not a function

问题详情 问题描述: element plus按需导入后,启动项目报错: 问题原因 unplugin-vue-components插件版本问题 查看 unplugin-vue-components插件可以发现版本太高了 问题解决 unplugin-vue-components 版本高了,我用的0.26.0&#xff0c…

【STM32+HAL】姿态传感器陀螺仪MPU6050模块

一、准备工作 有关OLED屏初始化的问题,详见【STM32HAL】OLED显示初始化配置 二、所用工具 1、芯片:STM32F10C8T6 2、CUBEMX配置软件 3、 6 轴运动处理组件MPU6050 三、实现功能 OLED屏显示姿态角 四、HAL配置步骤 1、开启I2C1进行MPU6050通信 2、开…

供应链管理(SCM):界面设计全面扫盲,得供应链者得天下

大家伙,我是大千UI工场,专注UI分享和项目接单,本期带来供应链系统的设计分享,欢迎大家关注、互动交流。 一、什么是SCM SCM系统是供应链管理(Supply Chain Management)系统的缩写。供应链管理是指协调和管…