2014-09-22 3 views
15

У меня есть вопрос, который относится к использованию pybrain для регрессии временного ряда. Я планирую использовать слой LSTM в pybrain для обучения и прогнозирования временного ряда.Прогнозирование временных рядов Pybrain с использованием рекуррентных сетей LSTM

Я нашел пример кода здесь в ссылке ниже

Request for example: Recurrent neural network for predicting next value in a sequence

В приведенном выше примере, сеть способна предсказать последовательность после ее обучаясь. Но проблема заключается в том, что сеть берет все последовательные данные, подавая их в один проход на входной уровень. Например, если данные обучения имеют 10 функций каждый, 10 функций будут одновременно подаваться на 10 входных узлов за один раз.

С моей точки зрения, это уже не предсказание временных рядов, я прав? Поскольку нет разницы в отношении времени, которое каждая функция подается в сеть? Поправьте меня, если я ошибаюсь.

Таким образом, я пытаюсь достичь, это рекуррентная сеть с единственным входным узлом и единственным выходным узлом. Входной узел - это то, где все данные временных рядов будут последовательно подаваться на разных временных шагах. Сеть будет обучена воспроизведению ввода на выходном узле.

Не могли бы вы предложить или направить меня на построение сети, о которой я говорил? Спасибо вам большое заблаговременно.

ответ

25

Вы можете обучить сеть LSTM с одним узлом ввода и одного узла вывода для делать предсказания временных рядов, как это:

Во-первых, так же, как хорошая практика, давайте использовать функцию печати Python3 в:

from __future__ import print_function 

Затем сделать простой временной ряд:

data = [1] * 3 + [2] * 3 
data *= 3 
print(data) 

[1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2]

Теперь поместите эти таймсерии в контролируемый набор данные, в котором мишень для каждого образца является следующей выборкой:

from pybrain.datasets import SequentialDataSet 
from itertools import cycle 

ds = SequentialDataSet(1, 1) 
for sample, next_sample in zip(data, cycle(data[1:])): 
    ds.addSample(sample, next_sample) 

Построить простую LSTM сеть с 1 входным узлом, 5 LSTM клеток и 1 выходного узлом:

from pybrain.tools.shortcuts import buildNetwork 
from pybrain.structure.modules import LSTMLayer 

net = buildNetwork(1, 5, 1, 
        hiddenclass=LSTMLayer, outputbias=False, recurrent=True) 

Поезд сети:

from pybrain.supervised import RPropMinusTrainer 
from sys import stdout 

trainer = RPropMinusTrainer(net, dataset=ds) 
train_errors = [] # save errors for plotting later 
EPOCHS_PER_CYCLE = 5 
CYCLES = 100 
EPOCHS = EPOCHS_PER_CYCLE * CYCLES 
for i in xrange(CYCLES): 
    trainer.trainEpochs(EPOCHS_PER_CYCLE) 
    train_errors.append(trainer.testOnData()) 
    epoch = (i+1) * EPOCHS_PER_CYCLE 
    print("\r epoch {}/{}".format(epoch, EPOCHS), end="") 
    stdout.flush() 

print() 
print("final error =", train_errors[-1]) 

Plot ошибки (обратите внимание, что в этой простой игрушки Например, мы проводим тестирование и обучение на том же наборе данных, что, конечно, не то, что вы могли бы сделать для реального проекта):

import matplotlib.pyplot as plt 

plt.plot(range(0, EPOCHS, EPOCHS_PER_CYCLE), train_errors) 
plt.xlabel('epoch') 
plt.ylabel('error') 
plt.show() 

Теперь попросите сети предсказать следующий образец:

for sample, target in ds.getSequenceIterator(0): 
    print("    sample = %4.1f" % sample) 
    print("predicted next sample = %4.1f" % net.activate(sample)) 
    print(" actual next sample = %4.1f" % target) 
    print() 

(код выше, основан на example_rnn.py и примеры из PyBrain documentation)

+0

Могу ли я попросить немного разъяснений на стадии подготовки. Что именно делает CYCLES и EPOCHS_PER_CYCLE частью тренировочного этапа? Кроме того, как это отличается от тренировки для х число эпох? –

+0

@ A.Devereux Сохраняет ошибку. Я думаю, что автор хотел сохранить ошибки каждый EPOCHS_PER_CYCLE, который в этом случае в 5 раз меньше всех ошибок. – MCSH

1

Я думаю, что лучше (проще/понятнее) пример, чтобы узнать из будет здесь, в нижней части страницы:

http://pybrain.org/docs/tutorial/netmodcon.html

По существу, один раз настроить, как показано на рисунке, он будет автоматически отслеживать прошлой истории входов (до тех пор, пока вы не нажмете сброс). Из документов:

http://pybrain.org/docs/api/structure/networks.html?highlight=recurrentnetwork#pybrain.structure.networks.RecurrentNetwork

«До .RESET() не вызывается, сеть отслеживает все предыдущие входы и, таким образом, позволяет использовать рецидивирующих соединений и слоев, которые выглядят назад во времени.»

Так что да, не нужно повторно представлять все прошлые входы в сеть каждый раз.

1

Я испытал LSTM предсказания некоторую временную последовательность с Теано. Я обнаружил, что для некоторой гладкой кривой это можно предсказать правильно. Однако для некоторой зигзагообразной кривой. Трудно предсказать. Подробная статья, как показано ниже: Predict Time Sequence with LSTM

Прогнозируемый результат можно показать следующим образом: http://www.fuzihao.org/blog/images/LSTM_predict.png

+0

Эй, клен, я читаю ваш код, и мне интересно, доступно ли это публично? Я попытался объединить эти части на ваш сайт, но все же не уверен в некоторых переменных. Не могли бы вы сообщить мне об этом? Спасибо – ahajib

+1

Привет, @ nimafl, код не является общедоступным, потому что я не обрезал код. Теперь это просто беспорядок лапши. Если вас что-то смущает, пожалуйста, оставьте комментарий ниже блога, и я попытаюсь это объяснить. – maple

+0

Спасибо. Я обязательно отправлю туда помощь. – ahajib