R, Монте-Карло и enterprise задачи

от автора

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

  • Вариант 1 — давайте решать частную задачу в общем виде. Решив ее таким образом, мы сможем попутно много чего еще порешать.
  • Вариант 2 — давайте для предсказания поведения нелинейной системы притянем сюда прогнозы, ML и массу модных штучек. Круто ведь.

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

Почему такие подходы могут быть избыточными? Да по многим причинам: время поиска решения задачи, время расчетов, требования к объему вычислительных ресурсов, проведение расчетов с завышенной точностью, построение неправильной модели, высокая сложность аналитического решения прямой задачи, высокая сложность решения обратной задачи и многое другое.

Но есть классический способ решения подобных задач, который особенно хорош при наличии под руками мощного вычислителя. Метод Монте-Карло. Стат. анализ результатов многократного решения прямой задачи, которая, как правило, хорошо алгоритмизируема.
Нужные ответы, в первом приближении, можно получить за несколько часов, включая понимание задачи, кодинг и проведение прикидочных расчетов.

Ниже просто 2 примера.

Пример 1. Комбинаторика вложенных списков

Исходная бизнес-задача состоит в расширении обучающей базы чат-бота на основе малого набора входных фраз. Большой выборки исходных фраз просто физически нет. Но ее можно существенно расширить путем предварительного анализа структуры предложений и генерации перестановок, разрешенных правилами языка. Например, «труба течет в помещении 6» и «в помещении 6 течет труба» идентичны по сути.

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

ll <- list(list('a', 'b', 'c'), 'd', list('e', 'f', list('g', 'h', 'i'))) # общая комбинаторика factorial(3) * factorial(3) * factorial(3) * factorial(3)

Эскиз возможного решения.

# в цикле развернем всю перестановку единичного списка ff <- function(x){   # если на входе список, то мы делаем для него перестановку и загоняем в рекурсию   res <- if(is.list(x)) {     sample(x, length(x), replace = FALSE) %>%       purrr::map(ff)   } else {     x   }    res }  procLine <- function(row){   purrr::map(row, ff) %>%     # превращаем в вектор     rlang::squash_chr() %>%     stri_c(collapse = "") }  # создаем список прецедентов, экспериментируем с размером выборки wks <- 1 future::plan(multiprocess, workers = wks) tic(glue("Generating permutations @ {wks} thread(s)")) df1 <- purrr::map(1:10^4, ~sample(ll, length(ll), replace = FALSE)) %>%   # для каждого прецедента делаем рекурсивный процессинг до плоского вида   # purrr::map_chr(procLine) %>%   furrr::future_map_chr(procLine) %>%   enframe(name = NULL) %>%   distinct() toc()

Пример 2. Прогнозирование очереди клиентов

Схема измерений такова, что можно снимать внешние показатели процесса (считаем его достаточно сложным и нестационарным по времени), такие как время прихода и ухода покупателей, структура корзины и многое другое.

Вариант №1 — решение задачи в лоб. Нулевые теоретические знания исполнителя + накопление исторической массы всевозможных внешних показателей (фич) и применение ML методов для «подгонки». Какие-то прогнозы строятся, но что, почему и как — остается за рамками, надо использовать лианеризованных «толмачей».

Вариант №2 — Используем научный способ познания. Открываем теорию систем массового обслуживания, строим стат. показатели процессов по параметрам СМО, запускаем параметризованную дискретную симуляцию обслуживания клиентов. Получаем «цифровую модель» Системы, обладающую рычажками для управления и аналитической объясняющей силой, основанной именно на природе наблюдаемых объектов, а не на наборе неких «фич».
В R есть для этого отличный пакет simmer. Вся информация и масса практических примеров по ссылке.

Предыдущая публикация — «Несколько штрихов о работе с идентификаторами bigint в R».


ссылка на оригинал статьи https://habr.com/ru/post/482020/


Комментарии

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

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