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

  • Tutorial


Возможно вы когда-нибудь встречали банкомат в режиме «Не обслуживается» (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();

Если вы не хотите разбираться в достаточно сложной математике нейронов и методов обучения, рекомендую найти готовую библиотеку для своего языка.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 11

    +4
    Господи! Какая нейронная есть?
    Это задача для любого ЯП поддерживающего массивы и функции
    Есть всего 2 параметра для прогноза снятие точностью 98%, это:
    — календарь (день недели, день месяца, выходной илинет, время года)
    — факт или прогноз зачисление з/п зарплатанными организациями около данного банкомата.
    Не надо бить из пушки по воробьям. Все равно ваша «сеть» для примера не учитывает выходы из строя соседених банкоматов, как своих или так и чужих.
      0
      Знал с университета, что нейронные сети используются для прогноза энергопотребления. Решив, что есть определённое сходство в прогнозе потребления электричества и прогнозе снятия денег в банкоматах, решил тоже попробовать использовать нейронные сети.

      Наверное, можно было вывести функцию, которая успешно давала бы прогноз на основе календаря и факта з/п для одного конкретного банкомата. Но обобщить одной функцией прогноз для банкоматов, стоящих, например, в офисных и торговых центрах, на вокзалах и где-нибудь в больницах (динамика снятия наличных в разных местах могут сильно отличаться), думаю, было бы не просто.
        +4
        > Знал с университета, что нейронные сети используются для прогноза энергопотребления.
        Могу и без университета дать такой прогноз. Итак:
        — Чем больше занимаешься нейронными сетями, тем больше потребляется электричества :)
      +1
      И какая это нейросеть? Её выкинуть надо и построить байесовскую функцию. Не пробуйте из нейронов собирать интересную себе функцию, это неудобные кубики.
        0
        Спасибо. Про байесовские функции — посмотрю теорию, не знал, что их для такого можно использовать.
        0
        банкам интересно знать будущее — сколько наличности будет снято

        Они и так знают. Такие ситуации случаются из-за так называемого «случайного наплыва клиентов».
          0
          Нередко в банках прогноз делается вручную, путём ежедневного просмотра остатков (разумеется, удалённо). Это не очень удобно, если парк банкоматов, условно, больше 1000 штук.
          +2
          простейшая регрессия на 2 фактора — день месяца и день недели, будет точнее, понятнее и логичнее в использовании.
          Проверил на примере из статьи, все отлично, прогнозируется.
            0
            МНК? :)
          0
          Микроскопом гвозди забивать. Специально для решения таких задач придуманы авторегрессионные модели (AR, ARMA, ARIMA).

          Only users with full accounts can post comments. Log in, please.