R, Monte Carlo e tarefas empresariais

Ao resolver problemas práticos com regularidade invejável, é preciso enfrentar duas abordagens típicas apresentadas nas reuniões ou no ar.


  • Opção 1 - vamos resolver um problema específico de uma maneira geral. Tendo resolvido dessa maneira, poderemos resolver muito mais ao longo do caminho.
  • Opção 2 - vamos prever previsões, ML e muitas coisas da moda para prever o comportamento de um sistema não linear. Legal depois de tudo.

No entanto, a aplicação de tais abordagens nem sempre é adequada à formulação inicial do problema.
É uma continuação de publicações anteriores .


Por que essas abordagens podem ser redundantes? Sim, por várias razões: o tempo necessário para encontrar uma solução para um problema, o tempo necessário para calcular, os requisitos para a quantidade de recursos de computação, executando cálculos com alta precisão, construindo o modelo errado, a alta complexidade da solução analítica para o problema direto, a alta complexidade de resolver o problema inverso e muito mais.


Mas existe uma maneira clássica de resolver esses problemas, o que é especialmente bom se você tiver um computador poderoso em mãos. Método de Monte Carlo. Stat. análise dos resultados de várias soluções para um problema direto, que, por via de regra, é bem algorítmico.
As respostas necessárias, como primeira aproximação, podem ser obtidas em poucas horas, incluindo a compreensão do problema, a codificação e a realização de cálculos aproximados.


Abaixo estão apenas 2 exemplos.


Exemplo 1. Combinatória de listas aninhadas


A tarefa comercial inicial é expandir a base de treinamento do bot de bate-papo com base em um pequeno conjunto de frases de entrada. Uma grande variedade de frases-fonte simplesmente não é fisicamente. Mas pode ser significativamente expandido por uma análise preliminar da estrutura da sentença e pela geração de permutações permitidas pelas regras da linguagem. Por exemplo, "um tubo flui na sala 6" e "em um tubo sala 6 flui" são essencialmente idênticos.


Então, uma declaração formalizada. Há uma lista multinível de listas aninhadas. É necessário gerar quase todas as permutações possíveis da lista original de valores, desde que as permutações dos elementos sejam permitidas apenas dentro de cada lista separada .


ll <- list(list('a', 'b', 'c'), 'd', list('e', 'f', list('g', 'h', 'i'))) #   factorial(3) * factorial(3) * factorial(3) * factorial(3) 


Um esboço de uma possível solução.
 #        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() 

Exemplo 2. Prevendo Filas de Clientes


O esquema de medição é tal que é possível obter indicadores externos do processo (consideramos bastante complicado e instável no tempo), como o horário de chegada e saída dos clientes, a estrutura da cesta e muito mais.


Opção número 1 - resolvendo o problema de frente. Zero conhecimento teórico do intérprete + acumulação da massa histórica de todos os tipos de indicadores externos (características) e uso de métodos de ML para "ajuste". Algumas previsões estão sendo feitas, mas o que, por que e como está além do escopo, é necessário o uso de "intérpretes" lianerizados.


Opção nº 2 - Usamos o método científico de cognição. Abrimos a teoria dos sistemas de filas, construímos uma estatística. indicadores de processo de acordo com os parâmetros QS, lançamos uma simulação discreta e parametrizada do serviço ao cliente. Temos um "modelo digital" do Sistema, que possui alavancas de controle e um poder explicativo analítico baseado precisamente na natureza dos objetos observados, e não em um conjunto de certas "características".
R tem um ótimo pacote de simmer para isso. Todas as informações e muitos exemplos práticos aqui .


Post anterior - “Alguns detalhes sobre como trabalhar com identificadores bigint em R” .

Source: https://habr.com/ru/post/pt482020/


All Articles