Python 基于LSTM递归网络的Pybrain时间序列预测

Python 基于LSTM递归网络的Pybrain时间序列预测,python,neural-network,time-series,prediction,pybrain,Python,Neural Network,Time Series,Prediction,Pybrain,我脑子里有一个问题,它涉及到使用pybrain对时间序列进行回归。我计划使用pybrain中的LSTM层来训练和预测时间序列 我在下面的链接中找到了一个示例代码 在上面的例子中,网络能够在训练后预测序列。但问题是,网络通过将所有顺序数据一次性输入到输入层来接收这些数据。例如,如果训练数据每个都有10个特征,那么这10个特征将同时馈送到10个输入节点中 据我所知,这不再是一个时间序列预测,对吗?既然每个功能输入网络的时间没有差异?如果我在这方面错了,请纠正我 因此,我试图实现的是一个只有一个输入

我脑子里有一个问题,它涉及到使用pybrain对时间序列进行回归。我计划使用pybrain中的LSTM层来训练和预测时间序列

我在下面的链接中找到了一个示例代码

在上面的例子中,网络能够在训练后预测序列。但问题是,网络通过将所有顺序数据一次性输入到输入层来接收这些数据。例如,如果训练数据每个都有10个特征,那么这10个特征将同时馈送到10个输入节点中

据我所知,这不再是一个时间序列预测,对吗?既然每个功能输入网络的时间没有差异?如果我在这方面错了,请纠正我

因此,我试图实现的是一个只有一个输入节点和一个输出节点的循环网络。输入节点是所有时间序列数据将在不同时间步顺序馈送的节点。将训练网络在输出节点再现输入

你能建议或指导我构建我提到的网络吗? 非常感谢您。

我认为一个更好(更简单/更清晰)的学习示例将出现在页面底部:

基本上,一旦如图所示进行设置,它将自动跟踪输入的过去历史(直到和除非您点击重置)。从文档中:

在调用.reset()之前,网络会跟踪所有以前的输入,从而允许使用定期连接和及时回溯的层

因此,是的,无需每次都向网络重新呈现所有过去的输入。

您可以训练具有单个输入节点和单个输出节点的LSTM网络,以进行如下时间序列预测:

首先,作为一个好的实践,让我们使用Python3的打印功能:

from\uuuuu future\uuuuu导入打印功能
然后,制作一个简单的时间序列:

data=[1]*3+[2]*3
数据*=3
打印(数据)
[1,1,1,2,2,1,1,1,1,2,2,2,1,1,1,2,2]

现在,将此timeseries放入受监督的数据集中,其中每个样本的目标是下一个样本:

从pybrain.datasets导入SequentialDataSet
从itertools导入周期
ds=顺序数据集(1,1)
对于示例,zip中的下一个示例(数据,循环(数据[1:]):
ds.addSample(样本,下一个样本)
构建一个简单的LSTM网络,包括1个输入节点、5个LSTM单元和1个输出节点:

从pybrain.tools.shortcuts导入buildNetwork
从pybrain.structure.modules导入LSTMLayer
net=buildNetwork(1,5,1,
hiddenclass=LSTMLayer,outputbias=False,Returnal=True)
培训网络:

来自pybrain.supervised导入RPROPMETER
从系统导入标准输出
培训师=培训师(网络,数据集=ds)
列_错误=[]#保存错误以便以后打印
每个周期的周期=5
周期=100
历元=历元/历元周期*历元周期
对于x范围内的i(周期):
培训师.培训周期(每个周期的周期)
train_errors.append(trainer.testOnData())
历元=(i+1)*每周期历元
打印(“\r epoch{}/{}”。格式(epoch,epoch),end=”“)
stdout.flush()
打印()
打印(“最终错误=”,列错误[-1])
绘制错误图(注意,在这个简单的玩具示例中,我们在同一个数据集上进行测试和培训,这当然不是您在实际项目中要做的!)

导入matplotlib.pyplot作为plt
plt.plot(范围(0,历元,历元/周期),列车误差)
plt.xlabel('epoch')
plt.ylabel('错误')
plt.show()
现在让网络预测下一个样本:

对于示例,ds.getSequenceIterator中的目标(0): 打印(“样本=%4.1f”%sample) 打印(“预测的下一个样本=%4.1f”%net.activate(样本)) 打印(“实际下一个样本=%4.1f”%target) 打印()
(上面的代码基于和的示例)

我已经测试了LSTM,用Theano预测了一些时间序列。我发现对于一些平滑的曲线,它可以被正确地预测。然而对于一些曲折的曲线。很难预测。详情如下:

预测结果如下所示:

(来源:)

我可以要求对培训步骤做一些澄清吗。训练阶段的周期和每个周期的阶段具体是什么?另外,它与仅针对x个历代的培训有什么不同?@A.Devereux它正在保存错误。我想作者希望每一个周期都保存错误,在本例中,它比所有错误小5倍。嘿,maple,我读了你的代码,我想知道它是否公开?我试着把你网站上的这些部分放在一起,但仍然不能确定其中的一些变量。你能告诉我这件事吗?谢谢,@nimafl,代码不是公开的,因为我没有删减代码。现在只是一堆面条。如果有什么让你困惑的事情,请在博客下方留言,我会尽力解释。谢谢。我一定会在那里发帖寻求帮助。