2014-09-15 5 views
3

Я пытаюсь закодировать нейронную сеть, которая может прогнозировать некоторые данные. Поэтому я использую PyBrain для python. Я понял, что SupervisedDataset подходит для этой задачи. Я взял некоторые данные о запасах и поместил 5 значений из него в качестве входных данных, а шестую - в качестве цели. Затем я построил прямую сеть с функцией buildNetwork и обучил ее BackpropTrainer.PyBrain нейронная сеть для прогнозирования запасов не узнает

В любом случае ошибка не будет меньше. Он застрял на ~ 0,6 и, кажется, колеблется там. Я попытался настроить импульс и скорость обучения, но это не помогло. Что я делаю не так?

from pybrain.datasets import SupervisedDataSet 
DS = SupervisedDataSet(5, 1) 

DS.addSample((44.055, 44.54, 44.04, 43.975, 43.49), (42.04,)) 
DS.addSample((44.54, 44.04, 43.975, 43.49, 42.04), (42.6,)) 
DS.addSample((44.04, 43.975, 43.49, 42.04, 42.6), (42.46,)) 
DS.addSample((43.975, 43.49, 42.04, 42.6, 42.46), (41.405,)) 
DS.addSample((43.49, 42.04, 42.6, 42.46, 41.405), (42.385,)) 
DS.addSample((42.04, 42.6, 42.46, 41.405, 42.385), (42.655,)) 
DS.addSample((42.6, 42.46, 41.405, 42.385, 42.655), (41.53,)) 
DS.addSample((42.46, 41.405, 42.385, 42.655, 41.53), (40.09,)) 
DS.addSample((41.405, 42.385, 42.655, 41.53, 40.09), (39.8,)) 
DS.addSample((42.385, 42.655, 41.53, 40.09, 39.8), (40.2,)) 
DS.addSample((42.655, 41.53, 40.09, 39.8, 40.2), (39.915,)) 
DS.addSample((41.53, 40.09, 39.8, 40.2, 39.915), (40.21,)) 
DS.addSample((40.09, 39.8, 40.2, 39.915, 40.21), (40.34,)) 
DS.addSample((39.8, 40.2, 39.915, 40.21, 40.34), (41.195,)) 
DS.addSample((40.2, 39.915, 40.21, 40.34, 41.195), (41.595,)) 
DS.addSample((39.915, 40.21, 40.34, 41.195, 41.595), (41.975,)) 
DS.addSample((40.21, 40.34, 41.195, 41.595, 41.975), (42.045,)) 
DS.addSample((40.34, 41.195, 41.595, 41.975, 42.045), (40.13,)) 
DS.addSample((41.195, 41.595, 41.975, 42.045, 40.13), (38.99,)) 
DS.addSample((41.595, 41.975, 42.045, 40.13, 38.99), (39.81,)) 
DS.addSample((41.975, 42.045, 40.13, 38.99, 39.81), (40.23,)) 
DS.addSample((42.045, 40.13, 38.99, 39.81, 40.23), (40.47,)) 
DS.addSample((40.13, 38.99, 39.81, 40.23, 40.47), (40.45,)) 
DS.addSample((38.99, 39.81, 40.23, 40.47, 40.45), (40.01,)) 
DS.addSample((39.81, 40.23, 40.47, 40.45, 40.01), (40.23,)) 
DS.addSample((40.23, 40.47, 40.45, 40.01, 40.23), (40.2,)) 
DS.addSample((40.47, 40.45, 40.01, 40.23, 40.2), (41.605,)) 
DS.addSample((40.45, 40.01, 40.23, 40.2, 41.605), (42.1,)) 
DS.addSample((40.01, 40.23, 40.2, 41.605, 42.1), (42.135,)) 
DS.addSample((40.23, 40.2, 41.605, 42.1, 42.135), (41.95,)) 
DS.addSample((40.2, 41.605, 42.1, 42.135, 41.95), (41.145,)) 
DS.addSample((41.605, 42.1, 42.135, 41.95, 41.145), (40.635,)) 
DS.addSample((42.1, 42.135, 41.95, 41.145, 40.635), (41.25,)) 
DS.addSample((42.135, 41.95, 41.145, 40.635, 41.25), (41.19,)) 
DS.addSample((41.95, 41.145, 40.635, 41.25, 41.19), (42.065,)) 
DS.addSample((41.145, 40.635, 41.25, 41.19, 42.065), (42.025,)) 
DS.addSample((40.635, 41.25, 41.19, 42.065, 42.025), (42.09,)) 
DS.addSample((41.25, 41.19, 42.065, 42.025, 42.09), (41.79,)) 
DS.addSample((41.19, 42.065, 42.025, 42.09, 41.79), (43.11,)) 


from pybrain.tools.shortcuts import buildNetwork 
FNN = buildNetwork(DS.indim, 15, DS.outdim, bias=True) 

from pybrain.supervised.trainers import BackpropTrainer 
TRAINER = BackpropTrainer(FNN, dataset=DS, learningrate = 0.005, \ 
    momentum=0.1, verbose=True) 

for i in range(1000): 
    TRAINER.train() 

Редактировать: Некоторые из комментариев были усомнились в том, что эти данные будут соответствовать нейронной сети в целом. Поэтому я сделал ту же сеть в Matlab, и все получилось просто отлично. После 11 тренировочных эпох ошибка была меньше 0,002.

same net and data in Matlab

Кроме того я пытался использовать SupervisedDataset из PyBrain, но это не будет работать. Теперь я не в курсе.

+2

Хотя у меня нет окончательного ответа на ваш вопрос, я хотел бы указать, что вы не обязательно что-то делаете * неправильно *. У ваших данных может быть не просто информация, которую можно предсказать - если вы * можете * использовать FFNN для прогнозирования вашего конкретного фондового рынка, чтобы получить прибыль, кто-то еще уже сделал бы это. Если вы сомневаетесь в своем коде, мой совет - сначала проверить вашу сеть на более простых данных и перейти оттуда. – goncalopp

+0

Кроме того, вы не указываете * которые * пять значений, которые вы используете в качестве данных обучения. Предполагая, что это 5 последовательных значений до того, которое вы хотите предсказать, обратите внимание, что это необычно для подачи необработанных данных NN. Большинство работ, которые я знаю о работе над обработанными данными и статистикой более высокого уровня – goncalopp

+0

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

ответ

2

Я нашел решение. Вначале необходимо было нормализовать данные о запасах. Поэтому я написал эту функцию:

def normalization(data, new_max, new_min): 
    old_max = 0 
    old_min = 0 

    # Finde altes Max- und Minimum 
    for i in range(len(data)): 
     if old_max < data[i]: 
      old_max = data[i] 
     elif old_min > data[i]: 
      old_min = data[i] 

    old_range = (old_max - old_min) 

    for i in range(len(data)): 
     if old_range == 0: 
      data[i] = new_min 
     else: 
      new_range = (new_max - new_min) 
      data[i] = (((data[i] - old_min) * new_range)/old_range) + new_min 

Я масштабируется данные между 0 и 1, и вуаля - сеть, наконец, узнать. Но нет, я не богат сейчас;)

+0

может у плз окончательный код ??? –

+0

Вам все еще нужно? – Gizmo

+0

Да Мне нужно это для моего кода –