时序预测 | MATLAB实现LSTM时间序列未来多步预测

news2024/11/25 11:37:03

基本介绍


实际工程中,未来预测是值得研究的课题之一,大部分深度模型在短期预测上表现不错,在中长
期预测上往往欠佳。
本文依然借助LSTM专栏的一些基础预测,探讨未来预测的简单实现方式。

程序设计


直接多步预测


·直接多步预测的本指还是单步预测,多步转单步,这种做法的问题是如果我们要预测N个时间
步,则复杂度很高,比如预测未来10天,则意味着我们要构建10个模型;
·另外需要注意的是,在使用这种方法的时候,我们在进行特征工程的时候要比较小心,因为我们
在序列问题的特征工程过程中常常会涉及到滞后特征的引入;
·时间窗的长度和我们处理无序的结构化问题有一些区别,长度的概念对应的是样本的数量,但是
实际上在结构化数据中,对应特征的维度。


递归多步预测


·基础数据加载和网络搭建可以参考时序预测IMATLAB实现LSTM时间序列预测文章,以下介绍
未来预测的实现方式。
·预测未来10个值,需要修改的地方如下:
numTimeSteps Test+10
idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest+10); 

numTimeStepsTest = numel(XTest);
for i = 2:numTimeStepsTest+10
    [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
end

YPred = sig*YPred + mu;
YTest = dataTest(2:end);
RMSE  = sqrt(mean((YPred(1:numel(XTest))-YTest).^2));
MAPE  = mean((YPred(1:numel(XTest))-YTest)./YTest);
disp(["RMSE1  ",RMSE ])
disp(["MAPE1 ", MAPE])
% 使用预测值绘制训练时序
figure
plot(dataTrain(1:end-1),'-.','Color',[0 0 255]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 255]./255)
hold on
idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest+10);
plot(idx,[data(numTimeStepsTrain) YPred],'-.','Color',[255 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[255 0 0]./255)
hold off
xlabel("Month")
ylabel("Cases")
title("Forecast")
legend(["Observed" "Forecast"])
% 将预测值与测试数据进行比较。
figure
subplot(2,1,1)
plot(YTest,'b:o','Color',[0 0 255]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 255]./255)
hold on
plot(YPred,'k-s','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',5,'MarkerFaceColor',[0 0 0]./255)
hold off
legend(["Observed" "Forecast"])
ylabel("Cases")
title("Forecast")
subplot(2,1,2)
stem(YPred(1:numel(XTest)) - YTest,'filled','Color',[180 60 0]./255,'linewidth',1,'Markersize',6,'MarkerFaceColor',[180 60 0]./255)
xlabel("Month")
ylabel("Error")
title("RMSE = " + RMSE)

 

预测效果 

 多输出策略
·传统的机器学习算法包括LRIGBDTISVM无法直接构建多输出模型而要借助于直接预测、递归预
测或者混合策略,但是神经网络可以打破这样的限制,可以非常灵活的支持多输入或者多输出的
形式。
·数据为单变量时序数据,导入时出现问题可能涉及数据转置操作,data=[data{:}]是把cell转换为
double,也可以直接使用自己的数据。
·需要注意的是我这里没有严格划分数据集,大家可以按照需要自行处理。

%长短时记忆的神经网络LSTM
clc;clear;
warning off;
%导入数据 
load data ;
data = [data{:}]';
n=length(data);    
u=n-10-10+1;
%%
%准备输入和输出训练数据
input_train=zeros(10,u);
for i=1:u 
    input_train(:,i)=data(i:i+10-1)';
end
output_train=zeros(10,u);
for i=1:u    
   output_train(:,i)=data(i+10:i+10+10-1)';
end

%% 归一化(全部特征 均归一化)
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%% LSTM 层设置,参数设置
inputSize = size(inputn,1);    %数据输入x的特征维度
outputSize = size(outputn,1);  %数据输出y的维度  
numhidden_units=600;
%% lstm
layers = [ ...
    sequenceInputLayer(inputSize)                 %输入层设置
    lstmLayer(numhidden_units,'name','hidden')    %隐藏层
    dropoutLayer(0.2,'name','dropout')            %隐藏层权重丢失率,防止过拟合
    fullyConnectedLayer(outputSize)               %全连接层设置 
    regressionLayer('name','out')];               %回归层(因为预测值为连续值,所以为回归层) 
%% trainoption(lstm)
opts = trainingOptions('sgdm', ...      %优化算法
    'MaxEpochs',600, ...                %遍历样本最大循环数
    'MiniBatchSize',20,...              %批处理
    'GradientThreshold',1,...           %梯度阈值
    'ExecutionEnvironment','gpu',...    %运算环境
    'InitialLearnRate',0.005, ...       %初始学习率
    'LearnRateSchedule','piecewise', ...%学习率计划
    'LearnRateDropPeriod',200, ...      %epoch后学习率更新
    'LearnRateDropFactor',0.8, ...      %学习率衰减速度
    'Verbose',0, ...                    %命令控制台是否打印训练过程
    'Plots','training-progress'...      %打印训练进度
    );

%% 网络训练
tic
net = trainNetwork(inputn,outputn,layers,opts);
% 预测
toc;
bn  = predict(net,inputn);
outputnn=mapminmax('reverse',bn,outputps);

%% 测试数据
%导入测试数据
dat= data;
nn=length(dat);    
uu=nn-10-10+1;
%准备测试数据
input_test=zeros(10,uu);
for i=1:uu 
    input_test(:,i)=dat(i:i+10-1)';
end
inputn_test=mapminmax('apply',input_test,inputps); 
%网络测试输出
yLSTMoutput = predict(net,inputn_test);
%网络输出反归一化
LSTMoutput= mapminmax('reverse',yLSTMoutput,outputps);
o1=LSTMoutput(1,1:end-1);
o2=LSTMoutput(:,end)';
LSTMoutputnew=[o1 o2];
output_test=dat(10+1:nn)';

%% 未来预测
%输入单组数据进行网络测试 
afLSTMoutputtest =dat(nn-10+1:nn,1);
afLSTMoutputtestn=mapminmax('apply',afLSTMoutputtest,inputps); 
%网络预测输出
af = predict(net,afLSTMoutputtestn);
%网络输出反归一化
afLSTMoutput=mapminmax('reverse',af,outputps);
aaf=afLSTMoutput'-(afLSTMoutput(1)-LSTMoutputnew(end));
afLSTMoutnew=[o1 o2 aaf];%合并
afLSTMoutnew=smooth(afLSTMoutnew);
%% 数据绘图
t0=1:n;
t1=n-nn+10+1:n;
t2=n-nn+10+1:n+10;
afLSTMoutnew=afLSTMoutnew(1:end);
output_test=output_test(1:end);
figure()
plot(t1,output_test,'-','Color',[0 0 180]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 180]./255);
hold on
plot(t2,afLSTMoutnew,'-','Color',[255 0 0]./255,'linewidth',0.8,'Markersize',5,'MarkerFaceColor',[255 0 0]./255)
legend('实际值','预测值','Location','NorthWest')
title('网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
h = gca;
h.FontName = '华文宋体';
h.FontSize = 12;
grid minor;
axis tight
%% 预测误差
%———————————————————————————————————————
error=LSTMoutputnew-output_test;
figure()
bar(error)
title('网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)

 预测效果

 

 

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

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

相关文章

【分布式应用】Ceph的实战应用

目录 一、创建 CephFS 文件系统 MDS 接口1.1服务端操作1)在管理节点创建 mds 服务2)查看各个节点的 mds 服务3)创建存储池,启用 ceph 文件系统4)查看mds状态,一个up,其余两个待命,目…

【深度学习】张量的广播专题

一、说明 张量广播(tensor broadcasting)是一种将低维张量自动转化为高维张量的技术,使得张量之间可以进行基于元素的运算(如加、减、乘等)。在进行张量广播时,会将维度数较少的张量沿着长度为1的轴进行复制…

数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)

目录 选择排序 思路图解 代码&#xff08;C语言&#xff09; 时间复杂度 堆排序 算法1 算法2 堆排序代码 选择排序 思路图解 代码&#xff08;C语言&#xff09; void Selection_Sort(ElementType A[], int N) {for(i 0; i < N; i){MinPosition ScanForMin(A,i,N…

【CSS】 position : static | absolute | relative | fixed | sticky

目录 1️⃣前言2️⃣内容2.1、什么是定位&#xff1f;2.2、为什么需要定位&#xff1f;2.3、如何使用定位&#xff1f;2.3.1、定位的组成2.3.2、static2.3.3、relative2.3.4、absolute2.3.5、fixed2.3.6、sticky 2.4、什么是 z-index &#xff1f;2.5、z-index 属性的取值2.6、…

Docker本地镜像发布到阿里云

我们构建了自己的镜像后&#xff0c;可以发布到远程镜像提供给其他人使用&#xff0c;比如发布到阿里云 使用build/commit生成新的镜像&#xff0c;并生成自己镜像的版本标签tag&#xff0c;此新的镜像在自己的本地库中&#xff0c;使用push可以将镜像提交到阿里云公有库/私有库…

阿里云推出“ModelScopeGPT”大模型调用工具,再添新贵

阿里云近日对外宣布将要推出其首款大模型调用工具——“魔搭GPT&#xff08;ModelScopeGPT&#xff09;”&#xff0c;从而为使用者们提供更为优质的人工智能应用支持。而作为阿里云人工智能产品家族中的新成员&#xff0c;这一创新工具也将进一步扩展阿里云在人工智能领域的影…

对抗网络GAN详解:GAN训练不稳定解决方法、GAN中使用的深度学习技巧、GAN使用任务领域、GAN资料大全整理

不建议用博弈论思想 (game theory) 去理解对抗网络&#xff0c;减弱生成器 G 与判别器 D 间的对抗属性有利于稳定训练。不要把判别器理解成一个分类器 (Discriminator, Classifier)&#xff0c;让判别器回归判别属性&#xff0c;像 Critic 那样输出一个评分。这样能让判别器为生…

总结SPI、I2C、UART三者的区别以及有关知识

SPI&#xff08;串行外设接口&#xff09;&#xff0c;I2C&#xff08;串行总线接口&#xff09;和UART&#xff08;通用异步收发器&#xff09;是三种常用的通信协议&#xff0c;用于在不同的设备之间进行数据传输。 目录 三者的区别&#xff1a; 单工&#xff0c;半双工&am…

windows10 搭建hadoop环境,并且使用hadoop命令

hadoop 环境创建 1. 八、window搭建spark IDEA开发环境 按照步骤安装完 2. windows下安装和配置hadoop 配置环境变量&#xff0c;注意JAVA_HOME路径&#xff0c;修改后&#xff0c;重启电脑&#xff0c;不重启容易报错&#xff01;&#xff01;&#xff01; ​ 新建dat…

Kubernetes - kubeadm部署

Kubernetes - kubeadm部署 1 环境准备1.1 在各个节点上配置主机名&#xff0c;并配置 Hosts 文件1.2 关闭防护墙&#xff0c;禁用selinux&#xff0c;关闭swap1.3 配置免密登录1.4 配置内核参数1.5 配置br_netfilter 2. 安装K8s2.1 安装docker(各节点)2.2 安装K8s组件(各节点)2…

泛型和Object类的区别

文章目录 使用的时机为什么集合类要是用泛型而不用Object如何将List< Object >aa转成List< User >bb使用泛型的好处&#xff1a;泛型标记符 使用的时机 泛型&#xff1a;如果我确定要用哪个对象&#xff0c;并且使用到这个对象里面的属性&#xff0c;选择用泛型&a…

疯狂数据结构-栈-Java

概念 基本概念解读 当谈到 "栈" 时&#xff0c;它是一种遵循后进先出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;原则 的有序集合。这意味着最后入栈的元素首先被弹出&#xff0c;而最早入栈的元素最后被弹 出。 在栈中&#xff0c;只能对最上面的…

物联网(IoT):连接未来的万物之网

引言&#xff1a; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过各种智能设备和传感器&#xff0c;使物体能够互联互通、收集和共享数据的网络。随着科技的不断进步和智能设备的普及&#xff0c;物联网的应用呈现出爆发式增长&#xff0c;对各…

【文末送书 - 数据分析之pandas篇④】- DataFrame数据合并

向阳花花花花 - 个人主页 迄今所有人生都大写着失败&#xff0c;但并不妨碍我继续向前 Python 数据分析专栏 正在火热更新中 &#x1f525; 文章目录 一、concat二、append三、merge3.1 没有属性相同时3.2 只有一个属性相同时1.一对一合并2.一对多合并3.多对多合并 3.3 有多个…

爬楼梯,假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

题记&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例…

mysql开启binlog并配置定期删除以及文件大小,删库跑路之数据恢复

一、开启并binlog日志并配置 1、配置文件 [mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirC:\\JJS\\software\\mysql-5.7.41-winx64\\mysql-5.7.41-winx64 # 允许最大连接数 max_connections200 # 服务端使用的字符集默认为8比特编码的latin1字符集 chara…

Vue前端生成UUID

基础使用 当使用Vue.js生成UUID时&#xff0c;我们可以使用 uuid 库来帮助我们生成通用唯一标识符&#xff08;UUID&#xff09;。UUID是一个128位的唯一标识符&#xff0c;它可以用于唯一标识对象、实体或数据。 以下是在Vue.js中生成UUID的详细步骤&#xff1a; 首先&…

SpringBoot——自动装配之@Import

文章目录 前言ImportImport 的作用1、Import(MyDemo1.class) 将某个对象加载至bean容器中2、Import一个类 该类实现了ImportSelector, 重写selectImports方法该方法返回了String[]数组的对象&#xff0c;数组里面的类都会注入到spring容器当中3、Import一个类&#xff0c;该类实…

Premiere Pro 2023(23.5) Mac

Premiere Pro是一个业界领先的视频编辑软件&#xff0c;旨在帮助用户快速、高效地制作和编辑专业质量的视频内容。作为Creative Cloud套装中的一部分&#xff0c;Premiere Pro具有丰富的功能和工具&#xff0c;可应对各种视频编辑需求。 Premiere Pro的主要特点包括多个视频和音…

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88057828