假如我有一个时间序列,例如是前100天的价格数据,然后我希望借此预测后20天的数据,这里为了方便每一天的数据只有一个价格。但是每一天的数据也可以是多维的,也就是每一天都有好多特征。

具体思想

首先训练模型预测下一天数据的能力,训练完后,我们使用历史数据预测第114天的数据,预测后,我们暂时将第114天的数据看做真是数据,放入历史数据中,再用它预测第115天的数据,依次类推,最终预测完后30天的数据。

定义模型

我们会使用torch.nn.LSTM()加载LSTM层。其参数定义如下:

多输入单输出lstm预测 python lstm输出多个预测值_深度学习

 其中:

  • input_size是我们输入的数据的维度,可以理解为我们每一天数据的维度。在这个问题里,每一天我们有的数据只有价格,因此input_size是1。如果每一天数据有n个特征,那么input_size是n。
  • hidden_size是隐藏状态h的特征数。关于LSTM中的具体结构我还没有很清楚,可以查看一下知乎问题。在这里我认为可以随意设置。
  • num_layers是我们要堆叠几个LSTM层。
class RegLSTM(nn.Module):
    def __init__(self, inp_dim, out_dim, mid_dim, mid_layers):
        super(RegLSTM, self).__init__()

        self.rnn = nn.LSTM(inp_dim, mid_dim, mid_layers)  # rnn
        self.reg = nn.Sequential(
            nn.Linear(mid_dim, mid_dim),
            nn.Tanh(),
            nn.Linear(mid_dim, out_dim),
        )  # regression

    def forward(self, x):
        y = self.rnn(x)[0]  # y, (h, c) = self.rnn(x)     
        seq_len, batch_size, hid_dim = y.shape
        y = y.view(-1, hid_dim)                           
        y = self.reg(y)                                   
        y = y.view(seq_len, batch_size, -1)               
        return y

    """
    PyCharm Crtl+click nn.LSTM() jump to code of PyTorch:
    Examples::
        >>> rnn = nn.LSTM(10, 20, 2)
        >>> input = torch.randn(5, 3, 10)     # 5个时间步,也就是每个时间序列的长度是5,3表示一共有3个时间序列,10表示每个序列在每个时间步的维度是10
        >>> h0 = torch.randn(2, 3, 20)
        >>> c0 = torch.randn(2, 3, 20)
        >>> output, (hn, cn) = rnn(input, (h0, c0))
    """

    def output_y_hc(self, x, hc):

        y, hc = self.rnn(x, hc)  # y, (h, c) = self.rnn(x)

        seq_len, batch_size, hid_dim = y.size()
        y = y.view(-1, hid_dim)
        y = self.reg(y)
        y = y.view(seq_len, batch_size, -1)
        return y, hc

LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现) - 知乎

使用LSTM进行简单时间序列预测(入门全流程,包括如何整理输入数据)_lstm预测_eecspan的博客-CSDN博客

时间序列预测——LSTM_行者无疆_ty的博客-CSDN博客_时间序列lstm

多变量时间序列的多步预测——LSTM模型 - 知乎