Интерес к нейронным сетям
Анализируя посещаемость нашего сайта, мы видим колоссальный интерес читателей к нейронным сетям. Данный инструментарий может решать целый набор задач, в том числе, прогнозировать временные ряды весьма эффективно. В частности, в своей диссертации я пишу следующим образом.
— В ряде работ [2],[36],[37] указано, что на сегодняшний день наиболее распространенными моделями прогнозирования являются авторегрессионные модели (ARIMAX), а также нейросетевые модели (ANN). В статье [3], в частности, утверждается: «Without a doubt ARIMA(X) and GRACH modeling methodologies are the most popular methodologies for forecasting time series. Neural networks are now the biggest challengers to conventional time series forecasting methods».
— Без сомнений модели ARIMA(X) и GARCH являются самыми популярными для прогнозирования временных рядов. В настоящее время главную конкуренцию данным моделям составляют модели на основе ANN.
У нас на сайте пока опубликован только один материал, посвященный нейронным сетям, в котором я давала советы по созданию сети. Интерес со стороны читателей заставляет меня более активно заниматься нейросетевым прогнозированием. Давайте попробуем шаг за шагом проделать работу по созданию, эффективному обучению и адаптации нейронной сети с тем, чтобы разобраться в нюансах нейросетевых моделей прогнозирования.
Первая нейронная сеть
Не стоит изобретать велосипед, а стоит взять готовый пример из книги Хайкина. Сама задача и ее решение подробно описаны в разделе 4.8 данной книги. Полный архив примеров для книги выложен у нас на форуме. Отдельно взятый рабочий пример можно скачать в архиве. Главный файл называется Create_ANN_step_0.m.
Приведенная программа решает задачу классификации. Прокомментирую текст основного файла.
% 1. Формирование исходного массива данных P=mk_data(500); % 2. Обучение нейронной сети по методу % Back Propagation Error (обратное распространение ошибки) [W1, b1, W2, b2, ep_err, a, end_ep]=... bpm_train(P, 4, 2, 2, .1, .5, 500, 0,0,0,0,0); % 3. Проверка граничных значений bpm_dec_bnds(W1, b1, W2, b2, .1); % 4. Формирование тестового массива T=mk_data(10000); % 5. Проверка созданной сети на тестовом массиве [cor, uncor]=bpm_test(W1,b1,W2,b2,T); % 6. Построение графика c=pl_circ([-2/3 0], 2.34, .01, 1);
Прогнозирование с помощью нейронной сети
Я взяла данный пример реализации нейронной сети, просмотрела внимательно содержание его функций и сделала свою нейронную сеть, которая прогнозирует торговый график по европейской территории РФ (далее ТГ) на 24 значения вперед. В архиве вы можете скачать, как полученный мною пример, так и исходные данные к нему. Основной файл называется Create_ANN_step_1.m
Шаг 1. Инициализация и исходные данные
Исходные данные по торговому графику содержатся в файле VOLUMES_EUR.mat и имеют значения за период с 01.09.2006 до 22.11.2011.
Обучение сети, то есть определение весов и смещений для всех нейронов я выполняю на периоде значений с 01.01.2010 по 31.12.2010.
В качестве тестового я выбрала период с 01.01.2011 по 22.11.2011.
Шаг 2. Предварительная обработка исходных данных
Из теории и из примера Хайкина я понимаю, что нейронная сеть работает со значениями временных рядов от 0 до 1. Исходные значения торгового графика в массиве VOLUMES_EUR, конечно, выходят далеко за этот диапазон. Для использования нейронной сети необходимо предварительно отмасштабировать исходный временной ряд, как показано на рисунках.
Рис 1. Предварительно мы имели значения от 57 847 до 111 720.
Рис 2. После масштабирования мы стали иметь значения от 0 до 1.
Шаг 3. Настройка нейронной сети
Так как в примере Хайкина содержалась трехслойная полносвязная нейронная сеть, то я на ней остановилась. Кроме того, из статей я знаю, что для прогнозирования энергопотребления чаще других используется именно трехслойная архитектура.
На вход нейронной сети я подаю 48 значений ТГ за двое предыдущих суток, скрытый слой после нескольких попыток стал содержать 72 нейрона, а на выходе мы получаем 24 прогнозных значений торгового графика на будущие сутки. Структура нейронной сети получилась следующая.
Рис 3. Структура разработанной нейронной сети.
После описания структуры указываются значения нескольких параметров нейронной сети (см файл Create_ANN_step_1.m). Не мудрствуя лукаво, оставила все значения, которые были установлены в примере Хайкина.
Шаг 4. Обучение сети
Двойной цикл по эпохам и внутренней корректировки весов я взяла в чистом виде из примера Хайкина. Такое обучение называется обучением нейронной сети по методу back propagation error (обратное распространение ошибки). Изменения внесены только в части формирования входа и выхода нейронной сети. Общие комментарии по ходу алгоритма приведены в тексте программы.
Шаг 5. Тестовое прогнозирование
На пятом шаге я формирую тестовый массив «T» и прогнозирую на полученной нейронной сети. Все прогнозирование в итоге сходится к нескольким строчкам кода.
% Вход i1 = T([(i-1)*24+1:i*24],2); i2 = T([(i-1)*24+1:i*24],3); input = [i1; i2]; % Прогноз outHiddenLayer = bpm_phi(W1 * input + b1); outOutputLayer = bpm_phi(W2 * outHiddenLayer + b2); % Переменная результата Result([(i-1)*24+1:i*24],1) = outOutputLayer;
По результатам прогноза я провожу инверсию масштаба.
Шаг 6. Оценка ошибки прогнозирования
На последнем шаге я вычисляю значения ошибки прогнозирования временных рядов MAE и MAPE.
Величина MAPE оставила около 4%, что показывает в целом адекватность разработанной нейросетевой модели прогнозирования. Однако мы знаем, что это далеко не предел точности! Аналогичное значение MAPE для того же самого временного ряда в отчете за аналогичный период (за 2011 год) составляет около 1.18% при использовании нашей внутренней модели прогнозирования. Подробности можно посмотреть в отчете Точность прогнозирования за истекшие периоды. В упомянутом отчете временной ряд назван для краткости ТГ ЕЦЗ (торговый график европейской ценовой зоны).
Результаты
Переделав пример Хайкина под нужны прогнозирования торгового графика (энергопотребления), мы получили новую нейронную сеть, трехслойную, полносвязную. Все параметры сети были из примера по книге Хайкина.
Созданная нейронная сеть обучается очень быстро: от 60 до 120 секунд в зависимости от мощности компьютера.
При тестовом прогнозировании на созданной нейронной сети получается прогноз торгового графика на сутки вперед с ошибкой MAPE ≅ 4%.
Исходный пример из книги Хайкина, а также мой пример нейронной сети для прогнозирования торгового графика европейской территории РФ с исходными данными вы можете скачать по приведенным ссылкам и попробовать решить свою задачу.
UPD 02.02.2016.Уважаемые читатели, если вы скачали пример и пытаетесь на скорую руку прикрутить его к своей задаче, то обращаю ваше внимание на следующее.
- Если вы потратили меньше чем 6 месяцев на эти работы, то не ждите никакого адекватного результата. И полгода на приличный результат мало!
- Если у вас возник вопрос вроде «а где в коде то и се?», то имейте в виду, что я не буду впредь на эти вопросы отвечать — задавать их тут бесполезно. Для того, чтобы найти ответ на такого сорта вопрос нужно внимательно пошагово прогнать программу и разобраться.
- Если, не смотря на внимательный разбор кода примера, вопрос все равно остался, то задумайтесь, тем ли вы занимаетесь. Математическое моделирование — сфера деятельности, подходящая далеко не всем.
Добрый вечер, Ирина!
Я только начинаю заниматься изучением нейросетевого прогнозирования... Спасибо большое за Ваш пример, он очень полезен для меня.Могли бы подсказать, в результате работы программы только ошибка прогноза, а где можно сам результат посмотреть, "что было" - "что стало". Вывод куда то ведется или это нужно сделать? И например, чтобы мне загрузить свои тестовые данные, мне их нужно записать вручную в файл "VOLUMES_EUR.mat"?Прошу прощения за, возможно "наивные" вопросы, но я только начинаю изучать матлаб, пока что чайник в этом.. Был бы очень признателен, если поможете, ответите.
Сергей, добрый день!
Пожалуйста!
У нас с вами есть фраза в коде
Из нее следует, что и факт, и результат прогноза хранятся в переменной Result.
Сергей, у вас довольно слабое понимание инструмента. Я бы посоветовала вам открыть и прочитать (хотя бы вводную часть) пособие по MATLABу. Многие ваши вопросы разрешатся.
mat — это встроенный формат MATLABа; чтобы сделать такой файл удобнее сначала подготовить данные в xls формате, а уж после загрузить xls в MATLAB буквально двумя строчками.
Добрый день, Ирина.
Подскажите пожалуйста есть ли смысл заниматься нейросетями на матлабе при очень большом объеме исходных данных. У меня объект - шахта, для обучения - входной вектор из аудиоряда с двух сотен микрофонов, длиной он в месяцы - но вход - кусочек в минуту. А выход - прогнозируемое событие: изменение технологических параметров, конкретно метанообразование). Итого объем данных по выборке более гигабайта.
Но эти детали наверное не очень важны.
Проще говоря, какова была размерность вашего файла для обучения для обучения в 40-60 секунд (можно просто к мегабайтах - мне этого будет достаточно)
Добрый день! У вас очень интересная задача, но данных действительно очень много, но это много не только для ANN, а вообще много. ANN — неплохой инструмент для подобной задачи, на мой взгляд. У меня в обучающей выборке было около ~30 000 значений временного ряда. Это немного, конечно, по сравнению с вашими данными.
Работать с сырыми массивами в таком случае довольно сложно, но нужно исходить из задачи:
Можете попробовать работать не с полным массивом, а с его кусочками, выборками. Можно их кластеризовать по некоторому признаку. Словом, не бойтесь объемов, научитесь обращаться с ними гибко.
добрый день, Ирина!
мы с програмистом практически повторили описанный алгоритм и получили аналогичные результаты по ошибкам на массиве EUR/USD. То есть все получилось и сработало. Но тут возник вопрос у программиста - а где собственно прогнозируемое окно? если Result вычисляется используя Index0 для тестового массива, то в этом масиве уже есть фактические данные , а прогнозируемое окно на 24 свечи вперед, означает что этих фактических данных еще нет, а прогнозируемое окно уже должно показать что "будет". Означает ли это, что мы должны поставить в тестовом массиве Index0 нули на величину одного окна в 24 свечи, а затем сравнить с фактическими данными поступившими в это окно?
будем благодарны за ответ
Илья, добрый день!
Смотрите внимательно, Result получается без использования Index0. Сначала берутся предыдущие дни (h-24; h-48), их индексы хранятся в Index1 и Index2.
Затем на основании этих индексов фомируется матрица T, где в 2 и 3 столбец записываются исторические значения.
А затем они используются для формирования входа сети.
Если все это проделать в дебаг режиме, то ответ на ваш вопрос будет быстро понятен.
Добрый День!!!! А можно с этого момента по подробней!!!!
Каким методом можно сделать масштабирование? Пожалуйста - направте на литературу или приведите пример как это делаеться и почему. Если у меня данные в диапазано от 0 до 3 или 2 , как отмашт. к 0 и 1?
Добрый день!
Скачиваете код примера в Matlab, смотрите на строки масштабирования и разбираетесь — в примере оно реализовано, достаточно разобраться каким образом.
Здравствуйте Ирина!Спасибо Вам за отличную статью! на ру кластере аналога ей нет, очень мало примеров прогнозирования временных рядов с помощью нейронных сетей!Скажите пожалуйста, нет ли у Вас возможности, адаптировать код под более популярный язык программирования java или С++?
Виктор, спасибо за приятные слова.
К сожалению, у меня нет примера на высокоуровнем языке программирования, потому как я ими очень слабо владею. Как говорит мой партнер Сергей: отличный математик не бывает отличным программистом. Работаю в основном двух пакетах: matlab и R.
Здравствуйте еще раз.По ходу разберательства сформировались еще несколько вопросов.Зачем на вход сети подавать данные за два прошедших дня (Xi-1, Xi-2)?почему бы просто не подать на вход Xi, и пытаться обучая сеть на выходе получить Xi.Далее не совсем понятно почему при формировании матрицы весов:для скрытого слоя <code>W1 = randn(NumberOfHiddenNeurons, NumberOfInputNeurons+1);</code>матрица строится по строкам по количеству нейронов скрытого слоя, по столбцам по количеству входных нейронов. Не понятно почему так,ведь по смыслу связьидет от входного к скрытому...вроде как должно быть наоборот <code>W1 = randn(NumberOfInputNeurons, NumberOfHiddenNeuron+1);.</code>В таком же виде строится матрица и для весов выходного слоя <code>W2 = randn(NumberOfOutputNeurons, NumberOfHiddenNeurons+1);</code>Также не ясно почему столбцов в матрице весов на 1 больше W1 = randn(NumberOfHiddenNeurons,<strong> NumberOfInputNeurons+1</strong>),по коду ясно, что это столбец загоняется в переменную b1/b2, которая в последствии используется для прогнозирования временного ряда.И вот собственно вопрос, что эта за переменная b1, зачем она нужна, потому как точность прогноза без нее падает ощутимо!
Ваш партнер не прав) Задачи решаемые программированием часто пересекаются с задачами математики.
Я его мнению очень доверяю и потому работаю над такими проблемами в паре с программистом. Еще не встречала приличного математика, который свободно владеет приемами качественного ООП.
Пропустила вопрос.
Если сеть обучена по принципу "из Xi получить Xi", то как получить прогноз?
Эти вопросы касаются понимания работы сети. Смотрите подробности в Хайкине. Мой пример основан на примере, который подробно разбирается в указанной книге. И вообще, это замечательная книга по нейронным сетям. Кроме того, можете посмотреть мой краткий материал по нейронным сетям.
Скачал ваш код. Во многом разобрался. Все понятно и доступно.
Но есть маленькое WHY?
NumPats = length((P:,1))/24;
24 – это NumberOfOutputNeurons?
Почему 24… не пойму..
И еще. Если я хочу увеличить число входов (нейронов) нужно ли увеличивать число циклов епох или это нужно делать только экспериментально. То есть смотреть не увеличивается ошибка…?
Еще раз спасибо Вам за статью и Ваши ответы.
Пожалуйста!
Так как исходный ряд Data, а также переменная P имеют значения в почасовом разрешении, а далее (ниже) в цикле обучения сети я перебираю сутки, то мне просто нужно из общего числа часов получить число суток. Вот так появилось 24 - в сутках 24 часа. Даты с переходами времени здесь не учитываются.
Доброго времени суток. Возникла идея пргнозирования исхода теннисных матчей на основе нейроннных сетей. Хотелось бы спросить, где у вас в программе можно найти заданные выходы соответствующих входов в сети на этапе обучения? Насколько я понимаю именно с заданными выходами и осуществляется сравнение полученных выходов на этапе обучения? Также непонятно, почему при прогнозировании на этапе теста используются предыдущие входы? Ведь на этапе обучения мы получиили нужные нам веса и теперь остается лишь поставлять новые значения входов? Хотелось бы узнать этот момент подробнее. И хотелось бы у вас попросить совета. В строящейся сети будет использовано 50 входных нейронов, 150 скрытых. Задача программы выдавать номер игрока-победителя (либо 1 либо 2). Таким образом как результат необходимо получить сеть с одним выходом. Возможно ли это? Ведь номер победителя будет являться логической величиной, полученной на основе входных характеристик каждых из игроков (то есть грубо говоря, если характеристики игрока 1 лучше игрока 2, то на выходе получаем -1, в обратном случае -2). Может ли нейронная сеть на выходе давать логическую величину? И как будет осуществляться обучение? Ведь получаемые числа будут сравниваться на этапе обучения опять же с логической величиной известных результатов. Просто можно ведь сделать два выхода сети: процент соответствия игроку 1 категории "победитель" и процент соответствия игроку 1 категории "проигравший". Но тогда непонятно как обучать. Ведь в известных результатах базы на этапе обучения есть только номер победителя. Надеюсь понятно изложил свои мысли. Заранее благодарен!
Добрый день!
Уважаемые читатели, я не только к автору сего вопроса обращаюсь, а вообще к посетителям. Я выложила пример с пояснениями и исходными данными не для того, чтобы вам тут пошагово каждый раз заново пояснять где чего. Мне такого сорта вопросы надоели до невозможности! Сядьте, наконец, и терпеливо разберитесь! Пример сделан много лет назад, чтобы ответить на ваши вопросы, мне нужно его открывать, смотреть, прогонять в дебаггере. Вы-то при этом чем заняты?
Если вы внимательно все это пошагово прогоните, то поймете, что это не так. И ваш вопрос лишь от невнимательности.
Да, возможно.
Да, может.
Здравствуйте, сильно не серчайте из-за глупого вопроса. Повлияет ли на ответ решения тот факт, что при тестовом прогнозировании не выделить в отдельный вектор величины смещения b1, b2, как вы сделали в примере?
b1 = W1(:,NumberOfInputNeurons+1) b2 = W2(:,NumberOfHiddenNeurons+1) W1 = W1(:,1:NumberOfInputNeurons)W2 = W2(:,1:NumberOfHiddenNeurons)
Они же изначально все обучение находятся в матрице W1 W2?
Наверное, вы правы. Нужно ведь только поправить код и посмотреть — никто вам не мешает это сделать, чтобы знать наверняка. У меня в последнее время голова больше о паровых турбинах болит, чем о нейронных сетях.
Здравствуйте. Спасибо большое за статью. Хотел бы Вам задать некоторые вопросы.
Буду писать дипломную работу на тему "Прогнозирование урожайности". При обучении на вход идет большое количество параметров(например 40) состояния растения и один выходной параметр(к примеру количество урожайности в тоннах соответствующие этим параметрам). После обучения, я могу ввести входные параметры текущего состояния растения и программа должна выдать какое кол-во тонн урожайности я получу при текущем состоянии.
Я ведь правильно понимаю, что нейронной сети по силам такая задача? На сколько я ознакомился, то мне необходимо использовать RNN(реккурентные нейронные сети). Я прав?
Добрый день!
Описание звучит так, что нейронные сети стоит попробовать в качестве инструмента для этой задачи. Другого на ум сразу не приходит... может еще CART. А сможет она или нет делать такого сорта прогноз, вы узнаете, когда потратите на это приличное время.
Откуда такая мысль?
Здравствуйте. Спасибо за ответ. CART не подходит, так как стоит задача реализовать это с помощью нейронных сетей.
Хотел уточнить: Вы так сказали, потому что не владеете такой информацией или хотите, чтоб я сам работал в эту сторону? Недопонял Вас.
Поправлюсь: GRNN (нейросеть обобщённой регрессии, generalized regression NN). Читал различные статьи и на киберфоруме посоветовал пользователь.
Я не знаю о результатах, потому что никогда такой задачей не занималась. У меня есть запись блога Что влияет на точность прогнозирования временного ряда? Посмотрите, может быть полезным для вас.
Такого сорта рекомендации (с форумов) лично у меня вызывают сомнения, однако начинать с чего-то надо. Вероятно, стоит попробовать то, что порекомендовали.
Ирина, добрый день, вы пишете:
"за двое предыдущих суток, скрытый слой после нескольких попыток стал содержать 72 нейрона"
Подскажите, какими методами вы выбирали архитектуру сети, как пришли к этим 72-м нейронам?
Выбрала самую простую архитектуру, число нейронов взяла, если мне не изменяет память, наобум.
Уважаемая Ирина. Я работаю в Арбитражном суде Татарстана и у нас как у того пожарника, все здорово, если б не пожары. Идет вал дел, причем меняясь по году. При этом, кто постарше знают о пиках и в это время уходят в отпуск. Я хочу запрогнозировать поступление на следующий год, об соптимизировать отпуска, чтоб в пики поменьше народа отдыхало. Есть исходники за 7-8 лет ежедневного поступления дел по сорока категориям. Мне нужна работающая программа. прогнозирования поступления дел.Наши аналитики увлечены РУЧНЫМ заполнением периодической отчетности и с ними у меня нет взаимопонимания. Руководство тоже недопонимает суть предложения и не верит в возможность прогноза. (Хотя все видно и так). Хочется: сделать, купить, найти программу или ее часть, чтобы обосновать свои предложения и пожить подольше. Вопрос: можно ли найти и купить в частном порядке такую программу с исходными кодами. Если да, то где и за сколько? С уважением, Алексей Кириллов.
Я вопросом не владею в должной мере, чтобы рекомендовать вам программное обеспечение. Но уверена, что готовых или полуготовых решений много и вам будет из чего выбрать. Удачи!
Добрый день.
Можно уточнить какие данные вы использовали в массиве VOLUMES_EUR.
Если я правильно понимаю, второй столбец это часы. Первый и третьи столбцы это энергопотребление?
Да, вы правильно поняли: столбец 1 — дата, столбец 2 — час, столбец 3 — значение торгового графика (потребления).
Ирина, здравствуйте! Подскажите пожалуйста, в какой последовательности файлы примеров из книги Хайкина идут по самой книге.
Добрый день, Алексей,
не могу вам точно сказать: я читала книгу кусками, сначала начало и всю основу, а дальше лишь то, что мне нужно — прогнозирование. И только.
Ирина, добрый вечер!
Опыта в программировании у меня нет, однако желание и интерес к ИНС подтолкнули к полному освоению MS Excel для их создания.) Но путь к звёздам вымощенным не бывает.) Прочитайте, пожалуйста, нижележащий текст и укажите на ошибку (-ки). Заранее спасибо!
Создал модель, обучил её по данным скважины. В качестве целевого вектора использовал двоичную систему счисления (0 и 1). В результате обучения половины весовых значений "ушло" в ноль: если для продолжения обучения подать новые данные, то те "нулевые" значения весов, подсчитанные на предыдущем этапе, уведут в ноль новые данные, что, как мне кажется, очень плохо.
И как реализовать прогноз? Подаю новые данные, а целевой вектор должен отсутствовать (то есть подставить "0" в формулу вычисления ошибки)?
Добрый день! Я бы сказала, что если у вас выходит много весовых коэффициентов, равных 0, то у вас неподходящая структура сети. По аналогии с регрессией: если после расчет коэффициантов линейной регрессии, некоторые из них равны 0, значит такие независимые переменные стоит выкинуть из модели. Можете попробовать снизить число слоев сети, можете попробовать снизить число входов. Короче, упрощайте до тех пор, пока все весовые коэффициенты не будут иметь некоторые значимые значения.
Ирина, Здравствуйте!
Возможно, в Вашем примере есть серьезный недочет.
Вы работаете с абсолютными значениями. В этом случае даже прогнозирование предпоследнего значения часто будет давать очень высокую (относительную)точность. Но это не означает высокую прогностическую ценность.
Например, я провел эксперимент на своих данных. На абсолютных значениях точность - высокая. На приращениях - совершенно неудовлетворительная. На Ваших данных, если брать приращения, то точность тоже высокая. Но у Ваших приращений автокорелляция 80+ процентов, а у меня около нуля. Т.е. работа с абсолютными значениями может вводить новичков в заблуждение.
Всего доброго!
Добрый день! Спасибо за комментарий. Нужно понимать цель поста: пояснить на пальцах, как сделать простейшую нейронную сеть. Если мы начнем рассуждать о том, какие значения прогнозировать и как оценивать ошибку, то для этого нужно писать отдельный пост, где все аспекты темы (далеко не очевидные для новичка) расписывать.
Если вы считаете, что тему автокорреляции ошибок сможете толково изложить, пишите, прислайте текст мне. Если я, в свою очередь, сочту его качественным, то опубликую здесь.