Python 例如:用于预测序列中下一个值的递归神经网络

Python 例如:用于预测序列中下一个值的递归神经网络,python,machine-learning,neural-network,time-series,pybrain,Python,Machine Learning,Neural Network,Time Series,Pybrain,有谁能给我举一个(pybrain)python中递归神经网络的实际例子来预测序列的下一个值吗? (我已经阅读了pybrain文档,我认为没有明确的例子。) 我也发现了这个。但在更一般的情况下,我看不出它是如何工作的。因此,我想问这里是否有人能想出一个清晰的例子,用递归神经网络预测pybrain序列的下一个值 举个例子 例如,我们有一个范围为[1,7]的数字序列 First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3

有谁能给我举一个(pybrain)python中递归神经网络的实际例子来预测序列的下一个值吗? (我已经阅读了pybrain文档,我认为没有明确的例子。) 我也发现了这个。但在更一般的情况下,我看不出它是如何工作的。因此,我想问这里是否有人能想出一个清晰的例子,用递归神经网络预测pybrain序列的下一个值

举个例子

例如,我们有一个范围为[1,7]的数字序列

First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

Second run (So second example): 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6

Third run (So third example): 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7

and so on.
First run (So first example): feature1: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
                              feature2: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7


Second run (So second example): feature1: 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
                                feature2: 1 2 3 7 2 3 4 6 2 3 5 6 7 2 4 7 1 3 3 5 6    

Third run (So third example): feature1: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
                              feature2: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

and so on.
现在给出一个新序列的开始:1 3 5 7 2 4 6 7 1 3

下一个值是什么

这个问题可能看起来很懒散,但我认为没有一个好的和体面的例子来说明如何使用pybrain


另外:如果存在多个功能,如何执行此操作:

例如:

例如,我们在[1,7]范围内有几个序列(每个序列有两个特征)

First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

Second run (So second example): 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6

Third run (So third example): 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7

and so on.
First run (So first example): feature1: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
                              feature2: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7


Second run (So second example): feature1: 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
                                feature2: 1 2 3 7 2 3 4 6 2 3 5 6 7 2 4 7 1 3 3 5 6    

Third run (So third example): feature1: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
                              feature2: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

and so on.
现在给出一个新序列的开始:

                                            feature 1: 1 3 5 7 2 4 6 7 1 3

                                            feature 2: 1 2 3 7 2 3 4 6 2 4
下一个值是什么



请随意使用您自己的示例,只要它与这些示例相似,并且有一些深入的解释。

这些步骤旨在实现您在问题第一部分中提出的要求

1) 创建一个受监督的数据集,该数据集的参数中需要一个样本和一个目标

 ds = SupervisedDataSet(21, 21)
 #add samples (this can be done automatically)
 ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
 ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
后续样本是其前身的目标或标签
y
。我们将编号设置为
21
,因为每个样本都有
21
编号或特征

请注意,对于问题后半部分中的标准符号,最好将feature1和feature2称为序列的sample1和sample2,并让features表示样本中的数字

2) 创建网络,初始化培训师并运行100个时代

net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
确保将
recurtive
参数设置为
True

3) 创建测试数据

ts = UnsupervisedDataSet(21, 21)
#add the sample to be predicted
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
我们创建了一个无监督的数据集,因为我们假设没有标签或目标

4) 利用训练好的网络预测测试样本

net.activateOnDataset(ts)
这将显示预期的第四次运行的值

对于第二种情况,当一个序列可以有多个样本时,不要创建受监督的数据集,而是创建一个序列数据集
ds=SequentialDataSet(21,21)
。然后,每次您获得一个新序列时,调用
ds.newSequence()
,并使用
ds.addSample()
在该序列中添加您称之为特性的样本

希望这是明确的:)


如果您希望获得完整的代码以避免导入库的麻烦,请告诉我。

Issam Laradji为我预测序列序列而工作,但我的pybrain版本需要UnserpsedDataSet对象的元组:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(21, 21)
ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(21,)
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]
给出:

=>[1,2,5,6,2,4,5,6,1,2,5,6,7,1,4,6,1,2,2,3,6]

要预测较小的序列,只需将其作为子序列或重叠序列进行训练(此处显示重叠):

从pybrain.tools.shortcuts导入buildNetwork
从pybrain.supervised.trainers导入BackpropTrainer
从pybrain.dataset导入受监控的数据集、无监控的数据集
从pybrain.structure导入LinearLayer
ds=受监控的数据集(10,11)
z=map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 5 6 2 4 5 1 2 5 6 1 4 1 2 3 6 1 3 5 7 2 4 6 7 1 6 1 2 2 3 7'.split())
obsLen=10
predLen=11
对于x范围内的i(len(z)):
如果i+(obsLen-1)+predLen
给出:

=>[3,5,6,2,4,5,6,1,2,5,6]


不太好…

嗯,你似乎没有回答这个问题。。。“例如,现在给出一个新序列的开始:1 3 5 7 2 4 6 7 1 3下一个值是/是什么”那么序列中最后3个值之后是什么?回答您的特定问题,给出的示例太少,没有意义-任何事情都是可能的。但是@好奇号给出的是算法,如果你给它输入大量的序列,我们不确定你是如何得到序列的,那么输出的准确度会更高。具体的答案不是我们感兴趣的。你的第二个例子似乎是一个可行的答案。你能详细说明“可行”的答案吗?如何判断输出是否“正常”?基于原始示例?但给出的例子太少了。