如何在PyBrain中进行多维时间序列预测?

时间:2013-11-05 23:35:38

标签: python time-series prediction pybrain

这是来自PyBrain谷歌小组的转发:https://groups.google.com/forum/#!topic/pybrain/J9qv0nHuxVY

我一直在修补OpenNN和FANN,还没有找到能满足我需要的人工神经库。

我会将其分解为短期和中期目标,但首先是一些背景......

背景

我想使用ANN来进行随时间变化的1000-2000项目向量的时间序列预测。每个元素都是一个布尔值,表示在特定时刻计算机视觉系统中存在一组视觉属性。

这个想法是在时间t-1向网络提供矢量,时间t处的矢量作为目标值。

网络的输出将基于向量的先前状态(t-1)预测当前时间(t)中预期发生的情况。

短期

我想训练人工神经网络,以便它可以学习随时间预测这些向量。也就是说,我想向它提供一个任意向量,它返回它已经训练过的向量。现在使用有限数据集很好,我期望从正常的时代学习开始。我从一个普通的监督数据集开始,输入和目标偏移一个时间单位。到目前为止,我没有在MSE返回方面显示出与FANN一样好的结果(第一个时期后错误没有显着减少),如下所述:https://groups.google.com/forum/#!topic/pybrain/QSfVHsFRXz0

在FANN中我只使用了一个简单的MLP,1026个输入,103个隐藏和1026个输出。布尔输入被缩放为-1到1,并且权重被初始化为-1和1之间的随机值。(这样做是因为显然学习更快,负值不仅仅是0-1)。网络很好地再现了输入模式,结果是一个小的MSE。

在PyBrain中,这是代码的当前版本:

#!/usr/bin/python
# First try and using pyBrain for building an ANN. We'll start with an MLP for obvious reasons.

from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.validation import ModuleValidator
import pickle, time

# Load the dataset (parse data)
print "Loading and parsing dataset..."
inputFile = open("../MLP/data/113584_backgroundState-filter-1.fann", 'r')
rawData = inputFile.readlines()
inputFile.close()
processedData = list()
for inputLine in rawData[1:]: # all but last element.
    data = inputLine.split() # Slicing to strip off the final newline
    scaleData = list()
    for item in data:
        scaleData.append(int(item))
    processedData.append(scaleData)

# Create dataset from parsed data
inputData = SupervisedDataSet(1027, 1027)
for index in xrange(0,len(processedData)-1,2): # every second line.
    inputData.addSample(processedData[index], processedData[index+1])

del processedData # no longer needed

# Build the same network as in FANN
net = buildNetwork(1027, 103, 1027, bias=True)

# Train the network
print "Training network..."
trainer = BackpropTrainer(net, inputData, verbose = True)
for i in xrange(5):
    startTime = time.time()
    error = trainer.train()
    print "ERROR " + str(i) + " " + str(error) # test network (calculate error)
    print "ProcessingTime " + str(i) + " " + str(time.time() - startTime)

# save results.
print "Saving network..."
fileObject = open('network.pybrain', 'w')
pickle.dump(net, fileObject)

# For each input pattern, what is the output?
# Compatible with FANN output
print "Testing network and generating results..."
i = 0;
for inputPattern in inputData['input']:
    outputPattern = net.activate(inputPattern)
    for j in xrange(len(inputPattern)):
        print "RESULT " + str(i) + " " + str(j) + " " + str(inputPattern[j]) + " " + str(outputPattern[j])
    i += 1

print "Done."

有关如何最好地进行学习的建议吗? (我希望我需要重新加速,但是想用普通的MLP将PyBrain与我以前的FANN结果进行比较。)

我实际上尝试使用recurrent = True构建此网络,但在我的所有测试中,python最终使用了所有可用的RAM并崩溃了(此机器上有8GB ram)。我不确定如何在不增加内存占用量的情况下实现并发性。

中期

最终,系统必须在线运行,输入在运行中不断变化。这意味着时代训练是不可能的,所以我需要能够运行学习算法的单次迭代。我意识到人工神经网络难以学习,但好消息是不会缺少数据点(至少100,000个)。因为没有固定的数据集,所以不需要收敛。我预计错误会随着新的或稳定的模式而出现上升和下降。

感谢您的任何意见和建议。

0 个答案:

没有答案