【MATLAB第2期】源码分享#基于LSTM时间序列单步预测,含验证和预测未来

2023-11-15

【MATLAB第2期】源码分享#基于LSTM时间序列单步预测,含验证和预测未来

1.运行环境

matlab2020a + cpu

2.数据说明

单列数据,2018/10~2018/12 共三个月,92个数据。
在这里插入图片描述

3.数据处理

样本标准化处理,其中,前85个数据作为训练样本,来验证后7个数据效果。最后预测未来7个数据。
numTimeStepsTrain = floor(85);%85数据训练 ,7个用来验证
dataTrain = data(1:numTimeStepsTrain+1,:);% 训练样本
dataTest = data(numTimeStepsTrain:end,:); %验证样本

4.LSTM参数设置

numHiddenUnits = 500;%隐含层神经元节点数
dropoutLayer(0.2)%丢弃层概率

5.运行过程

在这里插入图片描述

根据训练效果RMSE误差图以及损失图,可在运行时降低训练次数,如设置为300,加快收敛。

6.运行结果

训练结果:
在这里插入图片描述

验证结果:
在这里插入图片描述

评价指标:
训练集数据的MAE为:2524.5837
验证集数据的MAE为:3277.468
训练集数据的MAPE为:0.3253
验证集数据的MAPE为:0.31752
训练集数据的RMSE为:3380.5039
验证集数据的RMSE为:3862.0957
原数据量级比较大,加上参数还需要打磨,所以误差显得比较大 。可以套用自己数据试试。

7.预测未来

在这里插入图片描述

8.代码展示:

%% 1.环境清理
clear, clc, close all;
%% 2.导入数据
data=xlsread('data.csv');
data1=data;
% 原始数据绘图
figure
plot(data,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
legend('原始数据','Location','NorthWest','FontName','华文宋体');
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
%% 3.数据处理
numTimeStepsTrain = floor(85);%85数据训练 ,7个用来验证
[XTrain,YTrain,XTest,YTest,mu,sig] = shujuchuli(data,numTimeStepsTrain);
%% 4.定义LSTM结构参数
numFeatures= 1;%输入节点
numResponses = 1;%输出节点
numHiddenUnits = 500;%隐含层神经元节点数 

%构建 LSTM网络 
layers = [sequenceInputLayer(numFeatures) 
 lstmLayer(numHiddenUnits) %lstm函数 
dropoutLayer(0.2)%丢弃层概率 
 reluLayer('name','relu')% 激励函数 RELU 
fullyConnectedLayer(numResponses)
regressionLayer];

XTrain=XTrain';
YTrain=YTrain';

%% 5.定义LSTM函数参数 
def_options();
%% 6.训练LSTM网络 
net = trainNetwork(XTrain,YTrain,layers,options);

%% 7.建立训练模型 
net = predictAndUpdateState(net,XTrain);

%% 8.仿真预测(训练集) 
M = numel(XTrain);
for i = 1:M
    [net,YPred_1(:,i)] = predictAndUpdateState(net,XTrain(:,i),'ExecutionEnvironment','cpu');%
end
T_sim1 = sig*YPred_1 + mu;%预测结果去标准化 ,恢复原来的数量级 
%% 9.仿真预测(验证集) 
N = numel(XTest);
for i = 1:N
    [net,YPred_2(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');%
end
T_sim2 = sig*YPred_2 + mu;%预测结果去标准化 ,恢复原来的数量级 
%% 10.评价指标
%  均方根误差
T_train=data1(1:M)';
T_test=data1(M+1:end)';
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
%  MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['验证集数据的MAE为:', num2str(mae2)])
%  MAPE
maep1 = sum(abs(T_sim1 - T_train)./T_train) ./ M ;
maep2 = sum(abs(T_sim2 - T_test )./T_test) ./ N ;
disp(['训练集数据的MAPE为:', num2str(maep1)])
disp(['验证集数据的MAPE为:', num2str(maep2)])
%  RMSE
RMSE1 = sqrt(sumsqr(T_sim1 - T_train)/M);
RMSE2 = sqrt(sumsqr(T_sim2 - T_test)/N);
disp(['训练集数据的RMSE为:', num2str(RMSE1)])
disp(['验证集数据的RMSE为:', num2str(RMSE2)])
%% 11. 绘图
figure
subplot(2,1,1)
plot(T_sim1,'-s','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on 
plot(T_train,'-o','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'LSTM拟合训练数据','实际分析数据','Location','NorthWest','FontName','华文宋体');
title('LSTM模型预测结果及真实值','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
xlim([1 M])
%-------------------------------------------------------------------------------------
subplot(2,1,2)
bar((T_sim1 - T_train)./T_train)   
legend('LSTM模型训练集相对误差','Location','NorthEast','FontName','华文宋体')
title('LSTM模型训练集相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
xlim([1 M]);
%-------------------------------------------------------------------------------------
figure
subplot(2,1,1)
plot(T_sim2,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
hold on 
plot(T_test,'-o','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255)
legend('LSTM预测测试数据','实际分析数据','Location','NorthWest','FontName','华文宋体');
title('LSTM模型预测结果及真实值','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
xlim([1 N])
%-------------------------------------------------------------------------------------
subplot(2,1,2)
bar((T_sim2 - T_test )./T_test)   
legend('LSTM模型测试集相对误差','Location','NorthEast','FontName','华文宋体')
title('LSTM模型测试集相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
xlim([1 N]);

%% 12.预测未来
P = 7;% 预测未来数量
YPred_3 = [];%预测结果清零 
[T_sim3] = yuceweilai(net,XTrain,data,P,YPred_3,sig,mu)

%%  13.绘图
figure
plot(1:size(data,1),data,'-s','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on 
plot(size(data,1)+1:size(data,1)+P,T_sim3,'-o','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'LSTM预测结果','Location','NorthWest','FontName','华文宋体');
title('LSTM模型预测结果','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');

9.代码获取:

调用函数以及案例数据可后台私信回复第2期”获取下载链接了,免费下载即可。
内容整理不易,求个关注,后续会持续分享机器学习相关的源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MATLAB第2期】源码分享#基于LSTM时间序列单步预测,含验证和预测未来 的相关文章

  • 在 MATLAB 中使用 sprintf 显示变量的小数

    我不明白接下来会发生什么sprintf http www mathworks se help techdoc ref sprintf html命令 gt gt vpa exp 1 53 ans 2 718281828459045534884
  • 使用每行的列索引向量提取矩阵元素

    我有一个MxN矩阵 我想要一个列向量v 使用向量s它告诉我对于矩阵中的每一行我将采用哪一列 这是一个例子 Matrix 4 13 93 20 42 31 18 94 64 02 7 44 24 91 15 11 20 43 38 31 21
  • 如何在循环中连接字符串?

    我想创建一个 inputdlg 其中包含具有相似名称的各种行 例如测试 1 测试 2 测试 3 等 所以我正在寻找某种方法来连接字符串for环形 我尝试过类似的东西 formatSpec Test d a sprintf formatSpe
  • 在 Matlab 中生成加权随机布尔矩阵

    我想生成一个5x5MatLab 中的矩阵仅由 1 和 0 组成 但是我希望能够设置任何值为 1 的可能性 我希望任何元素有 90 的机会为 1 而不是 0 然而我不希望总是有 90 的 1 和 10 的 0 我只是希望这种情况更有可能发生
  • 在 MATLAB 中调整 3D 矩阵(图像)的大小

    我有一个 3D 矩阵 MxNxK 想将其大小调整为 M xN xK 就像 matlab 中的 imresize 一样 我正在使用图像金字塔 但其结果不是很准确 需要一个更好的 有什么解决办法吗 你可以使用interp3 因为您想要插入 3D
  • 这是 Matlab 的错误吗?你有同样的问题吗? [复制]

    这个问题在这里已经有答案了 我的Matlab版本是R2012a为什么在Matlab中1 1 0 2不等于0 9 这太糟糕了 gt gt 1 1 0 2 0 9 ans 0 这不是Matlab问题 这是一个浮点问题 在 C 或任何符合以下标准
  • 将 matlab 中的 find() 转换为 python

    我正在将代码从 Matlab 转换为 Python Matlab中的代码为 x find sEdgepoints gt 0 sNorm lt lowT sEdgepoints x 0 两个数组的大小相同 我基本上是在创建一个掩码 I rea
  • 将零填充到二进制数中特定位置的命令?

    我需要将零填充到二进制数的特定位置 循环二进制数的数组形式 例如dec2bin 43 添加零并调整大小听起来像是轮子的重新发明 如何在Matlab中有效地将零填充到二进制数 Looping positions 1 3 6 x de2bi 4
  • 如何在Matlab中计算两个矩阵之间的快速外积?

    我有两个 n m 矩阵 A and B 我想创建一个新的矩阵C类似于 for i 1 n C C outerProduct A i B i end i e C是一个大小为 m x m 的矩阵 即各行的所有外积之和A and B 有没有一种无
  • 如何在 Matlab 中使用变化的输入/时间相关的输入函数求解 DAE?

    我正在使用 ode15i 求解器求解 DAE 问题 我有 8 个变量和 8 个方程 系统很复杂 到目前为止唯一可用的求解器是 ode15i 我使用过该指南 http se mathworks com help symbolic set up
  • 使用 MATLAB 读取 CSV 文件?

    我正在尝试使用 MATLAB 读取 csv 文件 这是我的代码 csvread out2 csv out2 csv 如下所示 03 09 2013 23 55 12 129 32 129 33 03 09 2013 23 55 52 129
  • MATLAB:让audioplayer()在函数结束后继续播放

    我正在使用使用以下子函数的代码 function playTone duration toneFreq Generate a tone samplesPerSecond 44100 the bit rate of the tone y si
  • 在不同长度的数组中查找相同的日期时间

    考虑以下儒略日期数组 Jday1 datenum 2011 01 01 00 00 yyyy mm dd HH MM 60 60 24 datenum 2011 12 31 23 00 yyyy mm dd HH MM Jday2 date
  • R和matlab中的qr函数

    我有一个关于将 matlab 函数转换为 R 的问题 我希望有人能提供帮助 matlab 和 R 中使用的标准 QR 分解称为 qr 据我了解 用两种语言执行 qr 分解的标准方法是 Matlab Q R qr A 满足QR A R z l
  • 如何从矩阵的每一行中减去一个向量? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将矩阵的每一行除以固定行 https stackoverflow com questions 4723824 how can i divide each row of a matrix by a
  • Windows 上 Matlab 64 位版本的免费 SCM [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当 Matlab 安装为 64 位版本时 它只能使用 64 位源代码控制系统 是否有免费的源代码控制系统
  • 如何绘制 NxN 圆数组?

    我想绘制一个 NxN 的圆数组 为了形象化 我附上了我想要实现的目标的图像 我是 MatlLab 的新手 所以我尝试先绘制一个圆 下面是示例代码 n 2 10 size of mask M zeros n I 1 n x I n 2 mas
  • 梯度下降Matlab实现

    我已经浏览了堆栈溢出中的许多代码 并在同一行上编写了自己的代码 这段代码有一些问题我无法理解 我正在存储值 theta1 和 theta 2 以及用于分析目的的成本函数 x 和 Y 的数据可以从此下载页 它具有 dat 文件形式的 x 和
  • 在 MATLAB 中一次为元胞数组分配不同的值

    我需要有关在 MATLAB 中创建元胞数组的帮助 其中每个元胞都是不同大小的数组 例如 假设我有这个简单的数组和值 A 5 3 8 7 0 4 1 B 10 元胞数组C必须创建为 C 10 20 30 40 50 10 20 30 10 2
  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB

随机推荐

  • 数据结构(五):前序遍历、中序遍历、后序遍历

    我们先看下二叉树的前序 后序和中序遍历 遍历下面这个二叉树 分别以前中后三种遍历方式 写出结点的顺序 前序遍历 顺序 根左右 或 中左右 遍历根节点 遍历根结点的左子结点 如果左结点不是叶节点 则以当前结点开始 重新从第一步开始循环 遍历根
  • keil错误 *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 解决方法

    keil错误 FATAL ERROR L250 CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 解决方法 出现这个是你的keli没有破解 步骤如下 1 以管理员的身份运行你的keli 2 以管理
  • 【Java+MySQL】使用JDBC连接MySQL 8.0数据库

    一 Java MySQL 8 0连接驱动包 下载链接 https pan baidu com s 1YFOImz0dCHtzIajSFq9xgg pwd boul 提取码 boul IDEA 导入方式 1 在 External Librar
  • Mysql 学习

    文章目录 下载 安装 修改 修改登录密码 授权 下载 Mysql 数据库的下载链接 注意 CenterOS 请选择 Red Hat 那一项 安装 这里介绍的是 5 7 版本 安装包是 rpm bundle tar 结尾的 创建 mysql
  • ZC-CLS381RGB颜色识别——配置寄存器组(上)

    文章目录 前言 一 ZC CLS381RGB简介 二 配置寄存器组 1 主控寄存器 2 检测速率寄存器 2 增益寄存器 2 颜色数据寄存器 三 状态转移图和信号波形图绘制 总结 前言 在现代工业生产中 颜色识别技术已经成为了一个非常重要的技
  • 使用JsonConvert.DeserializeObject注意事项

    在使用JsonConvert DeserializeObject反序列化自定义对象的时候 我遇到了一个问题 定义了一个对象QueryModel QueryModel拥有两个构造方法 私有无参构造方法 private QueryModel 跟
  • android直接方法和虚方法,Android NDK入门:C++ 基础知识

    为什么写这篇文章 本文算作是 Android 音视频开发打怪升级 系列文章的 番外 篇 原本打算将本文的内容写在 Android FFmpeg视频解码播放 这篇文章中 因为要想学习 FFmpeg 相关知识 C 的基础知识是必不可少的 但是写
  • java集合框架Map之HashMap底层原理解析

    感兴趣的话大家可以关注一下公众号 猿人刘先生 欢迎大家一起学习 一起进步 一起来交流吧 哈希表 hash table 哈希表也称为散列表 散列表 Hash table 也叫哈希表 是根据关键码值 Key value 而直接进行访问的数据结构
  • STM32——HAL版——定时器ms和us延时函数

    定时器做ms和us延时函数 本文用的是STM32L431RCT6芯片 定时器TIM2和TIM6挂载在APB1总线上 1 配置TIM2为ms延时定时器 TIM2为通用定时器在APB1总线上 主频为80MHz 设置TIM2参数 时钟源选择为内部
  • Android应用请求获取Root权限

    要让Android应用获得Root权限 首先Android设备必须已经获得Root权限 应用获取Root权限的原理 让应用的代码执行目录获取最高权限 在Linux中通过chmod 777 代码执行目录 代码如下 应用程序运行命令获取 Roo
  • 企业实践

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 文章目录 0x00 前言简述 1 背景了解 2 发展历程 3 产品版本 4 官
  • Tensorflow入门——自制数据集:将未经处理的图片制成npy格式的数据集

    一些吐槽和文章简介 博主是那种 拿来就用 不会再查 的人 而几乎所有教程都秉持着 这应该是python课教的 的理念 从而使得没学过python的人颇为头疼 博主虽接触过python 但还没系统学过 阅读一篇代码 最耗时的部分不是探索算法原
  • Java基础(二):System.arraycopy()和Arrays.copyof()

    目录 1 Arrays copyOf 和 System arrayCopy 1 1 Arrays copyOf 1 2 System arrayCopy 1 3 区别 1 Arrays copyOf 和 System arrayCopy 1
  • java中用iterator去检查最大值,如何从Java 8中的Iterator获取n个第一个值?

    I have sorted a HashMap using Sort a Map by values Java to that I have a LinkedHashMap i e an Iterable which garantees i
  • maven 自定义archetype

    Maven提供了archetype帮助我们快速构建项目骨架 很便捷 但是 中央仓库中的archetype版本过于陈旧 构建好项目后 需要修改很多信息 甚是麻烦 那么如何自定义个archetype就显得很有必要 自定一个archetype须遵
  • numpy中的np.random.rand、np.random.randn、np.random.randint、np.random.uniform等用法

    随机数生成方法 1 np random rand d0 d1 dn np random rand d0 d1 dn 生成一个指定形状的 0 1 之间均匀分布的随机数数组 参数d0 d1 dn指定了生成的随机数数组的维度 import num
  • js光标事件

    JavaScript是基于对象 object based的语言 而基于对象的基本特征 就是采用事件驱动 event driven 它是在图形界面的环境下 使得一切输入变化简单化 通常鼠标或热键的动作我们称之为事件 Event 而由鼠标或热键
  • DNF管理软件包

    DNF是一款Linux软件包管理工具 用于管理RPM软件包 DNF可以查询软件包信息 从指定软件库获取软件包 自动处理依赖关系以安装或卸载软件包 以及更新系统到最新可用版本 DNF与YUM完全兼容 提供了YUM兼容的命令行以及为扩展和插件提
  • 【文心一言】如何申请获得体验资格,并简单使用它的强大功能

    目录 一 文心一言 1 1 它能做什么 1 2 技术特点 1 3 申请方法 二 功能体验 2 1 文心一言 2 2 写冒泡排序代码 测试代码 2 3 画一个爱心 2 4 画一个星空 三 申请和通过 3 1 申请时间 3 2 通过时间 文心一
  • 【MATLAB第2期】源码分享#基于LSTM时间序列单步预测,含验证和预测未来

    MATLAB第2期 源码分享 基于LSTM时间序列单步预测 含验证和预测未来 1 运行环境 matlab2020a cpu 2 数据说明 单列数据 2018 10 2018 12 共三个月 92个数据 3 数据处理 样本标准化处理 其中 前