目录
I. 前言
系列文章:
- 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
- PyTorch搭建LSTM实现时间序列预测(负荷预测)
- PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)
- PyTorch搭建LSTM实现多变量多步长时间序列预测(负荷预测)
- PyTorch搭建双向LSTM实现时间序列预测(负荷预测)
- PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)
在PyTorch搭建LSTM实现多变量多步长时间序列预测(负荷预测)中我简单实现了一下LSTM的多变量多步预测,其中LSTM搭建如下:
classLSTM(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)defforward(self, input_seq):
batch_size, seq_len = input_seq[0], input_seq[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(batch_size, seq_len, num_directions * hidden_size)
output, _ = self.lstm(input_seq,(h_0, c_0))
pred = self.linear(output)
pred = pred[:,-1,:]return pred
可以看到,在得到output之后我直接将其经过一个线性层,将单个输出转成了多个输出,这种方法的优点是比较简单,但可能没有考虑到时间序列之间的相关性,而是直接将其变成了一个非线性转换问题。下面我总结一下常见的五种多步预测方法。
II. 多步预测
2.1 直接多输出
这种方法也就是我之前那篇文章所使用的方法,输入经过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,:]
2.2 单步滚动预测
我们遵循LSTM的原理,每次只预测单个,比如前10个预测后3个:我们首先利用[1…10]预测[11’],然后利用[2…10 11’]预测[12’],最后再利用[3…10 11’ 12’]预测[13’],也就是为了得到多个预测输出,我们直接预测多次。这种方法的缺点是显而易见的:由于每一步的预测都有误差,将有误差的预测值带入进行预测后往往会造成更大的误差,让误差传递。利用这种方式预测到后面通常预测值就完全不变了。
2.3 多模型单步预测
比如前10个预测后3个,那么我们可以训练三个模型分别根据[1…10]预测[11]、[12]以及[13]。也就是说如果需要进行n步预测,那么我们一共需要训练n个LSTM模型,缺点很突出。
2.4 多模型滚动输出
这种方式是2.2和2.3的结合,还是以前10个预测后3个为例:按照2.3中描述训练三个模型,首先模型1利用[1…10]预测[11’],然后模型2利用[2…10 11’]预测[12’],最后由模型3利用[3…10 11’ 12’]预测[13’]。
2.5 seq2seq预测
和直接多输出有点类似,但采用编码器-解码器结构来进行训练。
III. 实验
实验和代码等忙完毕设再慢慢补充。
版权归原作者 Cyril_KI 所有, 如有侵权,请联系我们删除。