![](https://habrastorage.org/files/fab/d78/966/fabd78966c4947e588a28c979f9c5391.jpg)
Возможно вы когда-нибудь встречали банкомат в режиме «Не обслуживается» (Out of service).
Одной из возможных причин такого состояния является отсутствие
Чтобы этого не возникало, банкам интересно знать будущее — сколько наличности будет снято в банкоматах и когда деньги совсем закончатся.
Под катом решение этой задачи при помощи простой нейронной сети.
Для начала разберёмся, что такое нейронная сеть. С дилетантской точки зрения нейронную сеть можно представить как некий «чёрный ящик», который принимает на вход и выдаёт на выходе некий набор параметров. Обучить нейронную сеть — значит натренировать её на эталонном наборе входных и выходных данных, который называют обучающей выборкой.
Рассмотрим простой пример.
Научимся при помощи нейронной сети находить значение функции «Исключающее «ИЛИ».
![](https://habrastorage.org/files/595/ff8/3cf/595ff83cf2d34ef28ea19c10ff47c5af.png)
Здесь слева a и b — входные параметры, а справа a?b — выходной параметр. Обучив нейронную сеть на таблице истинности, мы сможем подавать на вход сети любые комбинации нулей и единиц и получать на выходе верный результат. Внимательный читатель заметил, что какое бы значение нулей и единиц мы не взяли после обучения, оно будет совпадать с одной из обучающих пар. В реальных задачах это обычно не так.
Вернёмся к нашим банкоматам.
Чтобы делать прогнозы, сначала необходимо
![](https://habrastorage.org/files/0f7/9d5/fcf/0f79d5fcff3046d49eb31c4f2c3847d8.png)
Для прогноза на понедельник «Недели 3» на вход нейронной сети подаются данные за два предыдущих понедельника. Эта нейронная сеть хороша, но не способна предсказать пики снятия наличных в конкретные даты месяца (зарплата?). Их хорошо прогнозирует следующая нейронная сеть:
![](https://habrastorage.org/files/552/60b/f46/55260bf463ea4aa6bcb7ce16cc10d5a5.png)
Для прогноза на 5 число «Месяца 3» на вход подаются данные за 4, 5, 6 числа двух предыдущих месяцев (это помогает улучшить прогноз, если «пиковый» день перенесётся на ±1 день из-за выходного или праздника).
В качестве результата можно было бы использовать среднее значение прогнозов двух предыдущих нейронных сетей. Но лучшим решением оказалось объединить их в одну большую нейронку:
![](https://habrastorage.org/files/798/54d/412/79854d4127904d219d8050bcb9c9733f.png)
Чтобы не
Хозяйке на заметку
Для реализации был использован фреймворк машинного обучения 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();
Если вы не хотите разбираться в достаточно сложной математике нейронов и методов обучения, рекомендую найти готовую библиотеку для своего языка.