Para simular uma distribuição normal a partir de um conjunto de variáveis uniformes, existem várias técnicas:
O algoritmo de Box-Muller , no qual se amostram duas variáveis uniformes independentes em e as transforma em duas distribuições normais padrão independentes via: Z 0 = √
o método CDF , onde se pode equiparar o cdf normal a uma variável uniforme: F ( Z ) = U e derivar Z = F - 1 ( U )
Minha pergunta é: qual é computacionalmente mais eficiente? Eu acho que é o último método - mas a maioria dos artigos que li usa Box-Muller - por quê?
Informação adicional:
O inverso do CDF normal é conhecido e dado por:
Portanto:
normal-distribution
simulation
uniform
user2350366
fonte
fonte
Respostas:
De uma perspectiva puramente probabilística, ambas as abordagens são corretas e, portanto, equivalentes. De uma perspectiva algorítmica, a comparação deve considerar a precisão e o custo da computação.
O Box-Muller conta com um gerador uniforme e custa aproximadamente o mesmo que este gerador uniforme. Como mencionado no meu comentário, você pode sair sem chamadas seno ou cosseno, se não sem o logaritmo:
O algoritmo de inversão genérico requer a chamada para o cdf normal inverso, por exemplo
qnorm(runif(N))
em R, que pode ser mais caro do que o descrito acima e, o que é mais importante, pode falhar nas caudas em termos de precisão, a menos que a função quantil seja bem codificada.Para acompanhar os comentários feitos pela whuber , a comparação
rnorm(N)
eqnorm(runif(N))
está na vantagem do cdf inverso, ambos em tempo de execução:e em termos de ajuste na cauda:
Após um comentário de Radford Neal no meu blog , quero salientar que o padrão
rnorm
em R faz uso do método de inversão, portanto a comparação acima está refletindo na interface e não no próprio método de simulação! Para citar a documentação R no RNG:fonte
R 3.0.2
, o método Box-Mueller (sem seno e cosseno e codificado usandorowSums
para calcularqnorm(runif(N))
. Ao executar o Mathematica 9, o Box-Mueller é dez vezes mais rápido que o diretoInverseCDF[NormalDistribution[], #] &
. O ponto é que a resposta depende dos recursos da plataforma computacional (bem como das habilidades de codificação de alguém). Isso está de acordo com o que você diz no primeiro parágrafo, mas pode levar os leitores a reinterpretar o restante de sua resposta.qnorm(runif(N))
é até 20% mais rápido do quernorm(N)
RNGkind(kind = NULL, normal.kind = 'Inversion');At <- microbenchmark(A <- rnorm(1e5, 0, 1), times = 100L);RNGkind(kind = NULL, normal.kind = 'Box-Muller');Bt <- microbenchmark(B <- rnorm(1e5, 0, 1), times = 100L)
eu recebomean 11.38363 median 11.18718
de inversão emean 13.00401 median 12.48802
de Box-Muller