Подтвердить что ты не робот

Прогнозирование предсказания временных рядов в нейронной сети (предсказание N-точечного прожектора) Большое итерационное обучение

(N = 90) Направление вперед Прогнозирование с использованием нейронной сети:

Я пытаюсь предсказать на 3 минуты вперед, т.е. на 180 пунктов вперед. Поскольку я сжимал данные временного ряда, беря среднее из каждых 2 точек как одно, я должен предсказать (N = 90) предсказание на шаг впереди.

Данные временных рядов приведены в секундах. Значения находятся между 30-90. Обычно они перемещаются от 30 до 90 и от 90 до 30, как показано в примере ниже.

enter image description here

Мои данные могут быть доступны: https://www.dropbox.com/s/uq4uix8067ti4i3/17HourTrace.mat

У меня возникают проблемы с внедрением нейронной сети, чтобы предсказать N пунктов вперед. Моя единственная функция - предыдущее время. Я использовал возвратную нейронную сеть elman, а также newff.

В моем сценарии мне нужно предсказать на 90 очков вперед. Сначала, как вручную отделить данные ввода и цели: Например:

data_in = [1,2,3,4,5,6,7,8,9,10]; //imagine 1:10 only defines the array index values.
N = 90; %predicted second ahead.
P(:, :)         T(:)     it could also be(2 theta time)  P(:, :)         T(:) 
[1,2,3,4,5]    [5+N]              |                     [1,3,5,7,9]     [9+N]
[2,3,4,5,6]    [6+N]              |                     [2,4,6,8,10]    [10+N]
...

до тех пор, пока он не достигнет конца данных

У меня есть 100 входных точек и 90 точек вывода в повторяющихся нейронных сетях Elman. Каким может быть наиболее эффективный скрытый размер node?

input_layer_size = 90;  
NodeNum1 =90;

 net = newelm(threshold,[NodeNum1 ,prediction_ahead],{'tansig', 'purelin'});
net.trainParam.lr       = 0.1; 
net.trainParam.goal     = 1e-3; 

//В начале моего обучения я фильтрую его с помощью kalman, нормализуя в диапазон [0,1], после чего я перетасовывал данные. 1) Я не смогу подготовить свои полные данные. Сначала я попытался подготовить полные данные M, которые составляют около 900 000, что не дало мне решения.

2) Во-вторых, я пробовал итеративно тренироваться. Но на каждой итерации новые добавленные данные объединяются с уже подготовленными данными. После 20 000 подготовленных данных точность начинает уменьшаться. Первые подготовленные 1000 данных отлично подходят для обучения. Но после того, как я начинаю iterativelt объединить новые данные и продолжить обучение, точность обучения очень быстро падает с 90 до 20. Например.

P = P_test(1:1000) T = T_test(1:1000) counter = 1;
     while(1)
      net = train(net,P,T, [], [] );%until it reaches to minimum error I train it.
      [normTrainOutput]    = sim(net,P,         [], [] );

      P = [ P P(counter*1000:counter*2000)]%iteratively new training portion of the data added. 
    counter = counter + 1; end

Этот подход очень медленный, и после точки он не даст никаких хороших результатов.

Мой третий подход - итеративное обучение; Это было похоже на предыдущее обучение, но на каждой итерации я только тренирую 1000 частей данных, не делаю никакого слияния с предыдущими данными. Например, когда я тренирую первые 1000 данных, пока не достигнет минимальной ошибки, которая имеет > 95% точность. После того, как он был обучен, когда я сделал то же самое для второй 1000 частей данных, он перезаписывает вес, а предиктор в основном ведет себя как последняя часть данных поезда.

> P = P_test(1:1000) T = T_test(1:1000) counter = 1; 
      while(1)
>       net            = train(net,P,T, [], [] ); % I did also use adapt()
>       [normTrainOutput]    = sim(net,P,         [], [] );
>    
>       P = [ P(counter*1000:counter*2000)]%iteratively only 1000 portion of the data is added.
>     counter = counter + 1; 
end

Обученные DATA: Эта цифра - это снимок из моего обученного набора, синяя линия - это исходный временной ряд, а красная линия - это предсказанные значения с обученной нейронной сетью. MSE составляет около 50.

enter image description here

Протестированные данные: На приведенном ниже рисунке вы можете увидеть мое предсказание для моих тестовых данных с нейронной сетью, которая обучается 20 000 входных точек, сохраняя при этом ошибку MSE < 50 для данных обучения задавать. Он способен ловить несколько шаблонов, но в основном я не даю реальной хорошей точности.

enter image description here

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

И я не мог найти эффективный способ предсказать на 90 очков вперед во временных рядах. Любые предложения, которые я должен сделать, чтобы предсказать N пунктов вперед, любой учебник или ссылку для информации.

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

==========

Любое предложение или то, что я делаю неправильно, будет очень оценено.

Я также реализовал рекуррентную нейронную сеть. Но при подготовке больших данных я столкнулся с одинаковыми проблемами. Возможно ли адаптивное обучение (онлайн-обучение) в Recurrent Neural Networks для (newelm)? Вес не будет обновляться, и я не видел никаких улучшений.

Если да, как это возможно, какие функции я должен использовать?

net = newelm(threshold,[6, 8, 90],{'tansig','tansig', 'purelin'});
net.trainFcn               = 'trains';
batch_size                 = 10;
while(1)
       net = train(net,Pt(:, k:k+batch_size ) , Tt(:, k:k+batch_size)   );
end
4b9b3361

Ответ 1

Посмотрите Echo State Networks (ESNs) или другие формы Пластовых вычислений. Они идеально подходят для прогнозирования временных рядов, очень просты в использовании и сходятся быстро. Вам вообще не нужно беспокоиться о структуре сети (каждый нейрон среднего уровня имеет случайные веса, которые не меняются). Вы узнаете только выходные веса.

Если я правильно понял проблему, с сетями состояний Echo, я бы просто тренировал сеть, чтобы предсказать следующую точку и на 90 пунктов вперед. Это можно сделать, просто выставив желаемый результат в выходных нейронах, а затем выполнив регрессию гребня, чтобы узнать выходные веса.

При запуске сети после ее обучения на каждом шаге n будет выводиться следующая точка (n + 1), которую вы будете возвращать в сеть в качестве входных данных (для продолжения итерации) и на 90 пунктов вперед (n + 90), который вы можете делать независимо от того, что хотите - то есть: вы также можете отправить его обратно в сеть, чтобы он влиял на следующие выходы.

Извините, если ответ не очень ясен. Трудно объяснить, как работает расчет резервуара в коротком ответе, но если вы просто прочитаете статью в ссылке, вам будет очень легко понять принципы.

Если вы решили использовать ESN, прочитайте этот документ, чтобы понять самое важное свойство ESN и действительно знать, что вы делаете.

EDIT: в зависимости от того, насколько "предсказуема" ваша система, прогнозирование на 90 пунктов вперед может быть очень сложным. Например, если вы пытаетесь предсказать хаотичную систему, шум будет представлять очень большие ошибки, если вы предсказываете далеко вперед.

Ответ 2

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