例如,请求:递归神经网络,用于预测序列中的下一个值
machine-learning
neural-network
python
4
0

谁能给我一个(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.

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

下一个是什么值

这个问题看似很懒,但是我认为缺少一个如何用pybrain做到这一点的好例子。


另外:如果存在多个功能,怎么办:

例:

举例来说,我们在[1,7]范围内有几个序列(每个序列具有2个特征)。

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

下一个是什么值


随意使用您自己的示例,只要它与这些示例相似并且有一些深入的说明即可。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

Issam Laradji的工作是为我预测序列的序列,除了我的pybrain版本要求UnserpervisedDataSet对象有一个元组:

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]

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

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(10, 11)
z = map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split())
obsLen = 10
predLen = 11
for i in xrange(len(z)):
  if i+(obsLen-1)+predLen < len(z):
    ds.addSample([z[d] for d in range(i,i+obsLen)],[z[d] for d in range(i+1,i+1+predLen)])

net = buildNetwork(10, 20, 11, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(10,)
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3'.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]

给出:

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

不是很好...

收藏
评论

这些步骤旨在执行问题第一部分中的要求。

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()))

后续样本是其前任x的目标或标签y 。我们将数字21因为每个样本都有21数字或特征。

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

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

net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)

确保将recurrent参数设置为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)

这应该显示预期的fourth run的值。

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

希望这是明确的:)

如果您希望拥有完整的代码来避免导入库的麻烦,请告诉我。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号