Qual é o melhor truque para acelerar a simulação de Monte Carlo? [fechadas]
-
05-07-2019 - |
Pergunta
Sempre que eu corro grande escala simulações de Monte Carlo no S-Plus, eu sempre acabo crescer a barba enquanto eu esperar por ele para ser concluído.
O que são os melhores truques para a execução de simulações de Monte Carlo em R? Qualquer bons exemplos de processos em execução de forma distribuída?
Solução
-
Usando vários núcleos / máquinas deve ser simples se você está apenas usando repetições independentes paralelos , mas estar cientes de deficiências comuns de geradores de números aleatórios (por exemplo, se estiver usando a hora atual como semente , gerando muitos processos com um RNG para cada produto poder correlacionados números aleatórios, o que leva a resultados inválidos - ver, por exemplo neste artigo )
-
Você pode querer usar variância redução para reduzir o número de repetições requeridas , isto é, para diminuir o tamanho da amostra necessária. técnicas mais avançadas de redução de variância pode ser encontrada em muitos livros didáticos, por exemplo, em esta .
Outras dicas
preallocate seus vetores!
> nsims <- 10000
> n <- 100
>
> system.time({
res <- NULL
for (i in 1:nsims) {
res <- c(res,mean(rnorm(n)))
}
})
user system elapsed
0.761 0.015 0.783
>
> system.time({
res <- rep(NA, nsims)
for (i in 1:nsims) {
res[i] <- mean(rnorm(n))
}
})
user system elapsed
0.485 0.001 0.488
>
Latin Hypercube Sampling é facilmente aplicada e tem uma grande influência sobre os resultados. Basicamente você ter uma amostra hipercubo latino de uma distribuição uniforme (por exemplo, usando randomLHS () no LHS pacote) e transformar isso para sua distribuição desejada usando, por exemplo, qnorm (uniformsample).
Eu sei que esta discussão é muito velho, mas se alguém se depara com ele e está à procura de um método mais rápido, eu acho que as seguintes obras:
library(data.table)
library(microbenchmark)
nsims <- 10000
n <- 100
# Answer from @Eduardo_Leoni:
preallocate<-function(nsims, n) {
res <- rep(NA, nsims)
for (i in 1:nsims) {
res[i] <- mean(rnorm(n))
}
return(res)
}
# Answer using data.table:
datatable<-function(nsims,n) {
dt <- data.table(i=1:nsims)[,list(res=mean(rnorm(1:n))),by=i]
return(dt)
}
# Timing benchmark:
microbenchmark(preallocate(nsims,n), datatable(nsims,n), times=100)
#Unit: milliseconds
# expr min lq median uq max neval
# preallocate(nsims, n) 428.4022 432.3249 434.2910 436.4806 489.2061 100
# datatable(nsims, n) 238.9006 242.3517 244.1229 246.5998 303.6133 100