Прогноз снятия наличных в банкомате при помощи простой нейронной сети

от автора

Возможно вы когда-нибудь встречали банкомат в режиме «Не обслуживается» (Out of service).

Одной из возможных причин такого состояния является отсутствие электричества денег в кассетах.

Чтобы этого не возникало, банкам интересно знать будущее — сколько наличности будет снято в банкоматах и когда деньги совсем закончатся.

Под катом решение этой задачи при помощи простой нейронной сети.

Для начала разберёмся, что такое нейронная сеть. С дилетантской точки зрения нейронную сеть можно представить как некий «чёрный ящик«, который принимает на вход и выдаёт на выходе некий набор параметров. Обучить нейронную сеть — значит натренировать её на эталонном наборе входных и выходных данных, который называют обучающей выборкой.

Рассмотрим простой пример.

Научимся при помощи нейронной сети находить значение функции «Исключающее «ИЛИ».

Здесь слева a и b — входные параметры, а справа a⊕b — выходной параметр. Обучив нейронную сеть по таблице истинности, мы сможем подавать на вход сети любые комбинации нулей и единиц и получать на выходе верный результат. Внимательный читатель заметил, что какое бы значение нулей и единиц мы не взяли после обучения, оно будет совпадать с одной из обучающих пар. В реальных задачах это обычно не так.

Вернёмся к нашим банкоматам.

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

Для прогноза на понедельник «Недели 3» на вход нейронной сети подаются данные за два предыдущих понедельника. Эта нейронная сеть хороша, но не способна предсказать пики снятия наличных в конкретные даты месяца (зарплата?). Их хорошо обрабатывает следующая нейронная сеть:

Для прогноза на 5 число «Месяца 3» на вход подаются данные за 4, 5, 6 числа двух предыдущих месяцев (это помогает улучшить прогноз, если «пиковый» день перенесётся на ±1 день из-за выходного или праздника).

В качестве результата можно было бы использовать среднее значение прогнозов двух предыдущих нейронных сетей. Но лучшим решением оказалось объединить их в одну большую нейронку:

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

Хозяйке на заметку

Для реализации был использован фреймворк машинного обучения Encog (доступен под .Net, Java и C++). Он позволяет очень высокоуровнево создавать нейронные сети, указывая лишь типы нейронов и их количество в каждом слое сети:

var network = new BasicNetwork(); network.AddLayer(new BasicLayer(null, true, 2)); network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 3)); network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 1)); network.Structure.FinalizeStructure(); network.Reset(); 

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

ссылка на оригинал статьи https://habrahabr.ru/post/265979/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *