技术标签: lstm 时间序列预测 多步长预测 DL pytorch 负荷预测
系列文章:
在PyTorch搭建LSTM实现多变量多步长时间序列预测(负荷预测)中我简单实现了一下LSTM的多变量多步预测,其中LSTM搭建如下:
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
super().__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.num_layers = num_layers
self.output_size = output_size
self.num_directions = 1 # 单向LSTM
self.batch_size = batch_size
self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
self.linear = nn.Linear(self.hidden_size, self.output_size)
def forward(self, input_seq):
batch_size, seq_len = input_seq.shape[0], input_seq.shape[1]
h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
output, _ = self.lstm(input_seq, (h_0, c_0))
pred = self.linear(output)
pred = pred[:, -1, :]
return pred
可以看到,在得到output之后我直接将其经过一个线性层,将单个输出转成了多个输出,这种方法的优点是比较简单,但可能没有考虑到时间序列之间的相关性,而是直接将其变成了一个非线性转换问题。下面我总结一下常见的五种多步预测方法。
这种方法也就是我之前那篇文章所使用的方法,输入经过LSTM之后,得到的输出是:
output(batch_size, seq_len, num_directions * hidden_size)
此时再经过一个线性层:
Linear(num_directions * hidden_size, output_size)
就变成了:
(batch_size, seq_len, output_size)
然后根据时间序列预测下一个的原理,我们直接取最后一个seq即可:
pred = pred[:, -1, :]
我们遵循LSTM的原理,每次只预测单个,比如前10个预测后3个:我们首先利用[1…10]预测[11’],然后利用[2…10 11’]预测[12’],最后再利用[3…10 11’ 12’]预测[13’],也就是为了得到多个预测输出,我们直接预测多次。这种方法的缺点是显而易见的:由于每一步的预测都有误差,将有误差的预测值带入进行预测后往往会造成更大的误差,让误差传递。利用这种方式预测到后面通常预测值就完全不变了。
比如前10个预测后3个,那么我们可以训练三个模型分别根据[1…10]预测[11]、[12]以及[13]。也就是说如果需要进行n步预测,那么我们一共需要训练n个LSTM模型,缺点很突出。
这种方式是2.2和2.3的结合,还是以前10个预测后3个为例:按照2.3中描述训练三个模型,首先模型1利用[1…10]预测[11’],然后模型2利用[2…10 11’]预测[12’],最后由模型3利用[3…10 11’ 12’]预测[13’]。
和直接多输出有点类似,但采用编码器-解码器结构来进行训练。
后面将陆续公开~
文章浏览阅读3.6k次,点赞2次,收藏7次。// 网页上只有一张图片 我们可以直接就进行图片保存// 但是你想 保存这张图片的时候 顺便把下面的字也带上 相当于截图 那请你像我这样做 <div id="capture" style="padding: 10px; background: #fff"> <img :src="whoImg" style="width: 300px" alt="" /> <h4 style="color: #000">Hello world!</h4_vue3 canvas生成海报图片
文章浏览阅读288次。python 全栈开发,Day57(响应式页面-@media介绍,jQuery补充,移动端单位介绍,Bootstrap学习) 昨日内容回顾 ajax //get post 两种方式 做 请求get 主要是获取数据post 提交数据同一个路由地址 ..._python开发响应式官网
文章浏览阅读494次。[Mark]The problems & solutions of vmware vsphere Vmware vSphere常见问题汇总(转)发表于2014 年 10 月 28 日由yukui 1、启用客户机操作系统和远程控制台之间的复制和粘贴操作..._filesystem.copydirectory();在某些文件和目录下未能完成操作。有关详细信息,请参
文章浏览阅读3.1k次。文章目录一、windeployqt.exe发布程序二、解决第三方依赖问题三、使用Inno打包成exe一、windeployqt.exe发布程序使用程序构建时相对应的命令工具进行发布我的程序使用MSVC进行构建Release的,故使用MSVC的命令行进行发布:步骤(截图):使用release生成exe程序(如:F:\QT\build-Yolov5Detect-Desktop_Qt_5_14_2_MSVC2017_64bit-Release\release)复制上述文件夹下exe文件到到新建文件_qt发布程序打包成安装程序
文章浏览阅读6w次,点赞38次,收藏175次。Android中播放音乐的几种方式前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑,其中涉及,RxJava2的被压、解除订阅等知识点,虽然简单,最起码没有丢了RxJava,后续Rxjava会继续研究,做记录. andorid提供了对声音_安卓开发播放音乐
文章浏览阅读1.5k次。环境准备。_flink cdc同步oracle
文章浏览阅读1.4k次。目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(IDE) 1. 在Eclipse中安装PyDev插件 2. 配置Python Interpreters _python this usually means that your interpreter is not in the system path.
文章浏览阅读4.4k次。Socket是客户端进行在网络与服务器进行数据交互的一种基本通信方式,通信有三种通信,即单工,半双工,和全双工。 所谓单工,就是只能够进行单向通信,如bb机。 而半双工就是一来一回的通信方式,如对讲机。 全双工也是最常用的,就是现实长连接实时通信,如QQ。 如果理解了上面的三个工作方式,那下面就以半双工为例,分析一下其工作的流程: 首先:在服务器端建立一个监听端口,没有多么复杂,就相当于一_如何实现刷全双工和半双工 socket
文章浏览阅读1.3k次,点赞2次,收藏9次。用c/c++语言程序实现Linux系统下的cp部分命令#include<stdio.h>#include<stdlib.h>#include<string.h>#include<dirent.h>#include<sys/stat.h>#include<unistd.h> //复制文件int copy_fil..._用c/c++语言程序实现linux系统下的cp复制文件命令
文章浏览阅读4.9k次,点赞2次,收藏25次。文章目录从B站直播间获取rtmp地址和直播码使用ffpmeg进行视频或摄像头推流前提条件1、首先要有一个树莓派,并连接了摄像头,且能够访问网络。2、在Bilibili中通过实名认证,并开通了直播间。(很简单的,实名认证通过后直接就可以开通了)。3、FFmpeg。推流默认使用FFmpeg,树莓派官方系统默认安装FFmpeg了的,可以使用ffpmeg -version查看详细信息。从B站直播间获取rtmp地址和直播码申请了B站直播间后,用电脑开启直播,一定要用电脑才能获取rtmp地址和直播码,用手机_树莓派在b站上推流
文章浏览阅读3.4k次,点赞5次,收藏18次。文章目录一、异步加载数据 方法一二、异步加载数据 方法二 - 推荐好文章 记得收藏+点赞+关注额 !!!---- Nick.Peng一、异步加载数据 方法一ECharts 中实现异步数据的更新非常简单,在图表初始化后不管任何时候只要通过 jQuery 等工具异步获取数据后通过 setOption 填入数据和配置项就行;代码 6 步实现及解析如下:<!DOCTYPE htm..._echarts异步数据
文章浏览阅读2.6k次。在平时的开发中,连接数据库进行增删改查的方案有很多,常见的直接有:jdbc,但是如果直接使用jdbc,会存在很多问题。首先,频繁的创建连接和释放会造成资源的浪费从而影响性能,这个问题可以用数据库连接池来解决。而且,还有一种情况比较坑,就是在开发中,有时新手在开发中会忘记close掉connection,造成连接数不够,无法访问数据库。一般企业开发中,如果使用jdbc,也不会直接手写,而是开发一个访问数据库连接的对象,比如DBACCESS之类的,在这个类里面进行连接进行创建和关闭,这样就不会踩到这个坑了_sqlsessionfactory 指定mapper xml目录及子目录