Ventajas de Box-Muller sobre el método CDF inverso para simular la distribución normal?

15

Para simular una distribución normal a partir de un conjunto de variables uniformes, existen varias técnicas:

  1. El algoritmo Box-Muller , en el que se toman muestras de dos variables uniformes independientes en (0,1) y se transforman en dos distribuciones normales estándar independientes a través de:

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. El método CDF , donde se puede equiparar el cdf normal a una variante uniforme: F ( Z ) = U y derivar Z = F - 1 ( U )(F(Z))

    F(Z)=U
    Z=F1(U)

Mi pregunta es: ¿cuál es computacionalmente más eficiente? Creo que es el último método, pero la mayoría de los documentos que leo usan Box-Muller, ¿por qué?

Información Adicional:

El inverso del CDF normal es conocido y dado por:

F1(Z)=2erf1(2Z1),Z(0,1).

Por lo tanto:

Z=F1(U)=2erf1(2U1),U(0,1).
usuario2350366
fuente
1
¿Cuál es el inverso del cdf normal? No se puede calcular analíticamente, solo si el CDF original se aproxima con una función lineal por partes.
Artem Sobolev
¿No están los dos estrechamente relacionados? Box Muller, creo, es un caso particular para la generación de 2 variantes.
ttnphns
Hola Barmaley, he agregado más información arriba. El CDF inverso tiene una expresión, sin embargo, el debe calcularse computacionalmente, por lo que podría ser por eso que se prefiere el cuadro Muller. Supuse que erf 1 se calcularía en tablas de búsqueda, al igual que los valores de sin y coseno . Por lo tanto, ¿no es mucho más costoso computacionalmente? Sin embargo, puedo estar equivocado. erf1erf1sincosine
user2350366
2
Hay versiones de Box-Muller sin pecado y coseno.
Xi'an
2
@Dilip Para aplicaciones de muy baja precisión, como gráficos de computadora, el seno y el coseno pueden optimizarse mediante el uso de tablas de búsqueda adecuadas. Sin embargo, para aplicaciones estadísticas, dicha optimización nunca se usa. En última instancia, no es realmente más difícil calcular que log o sqrt , pero en los sistemas informáticos modernos, las funciones elementales relacionadas con exp --incluidas las funciones trigonométricas-- tienden a optimizarse ( cos y log fueron instrucciones básicas en Intel) 8087 chip!), Mientras que erf no está disponible o se ha codificado a un nivel más alto (= más lento). erf1logsqrtexpcoslog
whuber

Respuestas:

16

Desde una perspectiva puramente probabilística, ambos enfoques son correctos y, por lo tanto, equivalentes. Desde una perspectiva algorítmica, la comparación debe considerar tanto la precisión como el costo informático.

Box-Muller depende de un generador uniforme y cuesta casi lo mismo que este generador uniforme. Como se mencionó en mi comentario, puede escapar sin llamadas de seno o coseno, si no sin el logaritmo:

  • generar hasta S = U 2 1 + U 2 21
    U1,U2iidU(1,1)
    S=U12+U221
  • tomar y defineX1=ZU1Z=2log(S)/S
    X1=ZU1, X2=ZU2

El algoritmo de inversión genérico requiere la llamada al cdf normal inverso, por ejemplo qnorm(runif(N))en R, que puede ser más costoso que el anterior y, lo que es más importante, puede fallar en las colas en términos de precisión, a menos que la función cuantil esté bien codificada.

Para seguir los comentarios hechos por whuber , la comparación de rnorm(N)y qnorm(runif(N))es una ventaja del cdf inverso, tanto en tiempo de ejecución:

> system.time(qnorm(runif(10^8)))
sutilisateur     système      écoulé
 10.137           0.120      10.251 
> system.time(rnorm(10^8))
utilisateur     système      écoulé
 13.417           0.060      13.472` `

y en términos de ajuste en la cola: enter image description here

Después de un comentario de Radford Neal en mi blog , quiero señalar que el valor predeterminado rnormen R utiliza el método de inversión, por lo tanto, la comparación anterior se refleja en la interfaz y no en el método de simulación en sí. Para citar la documentación de R en RNG:

‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
 Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
 ‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
 (For inversion, see the reference in ‘qnorm’.)  The
 Kinderman-Ramage generator used in versions prior to 1.7.1 (now
 called ‘"Buggy"’) had several approximation errors and should only
 be used for reproduction of old results.  The ‘"Box-Muller"’
 generator is stateful as pairs of normals are generated and
 returned sequentially.  The state is reset whenever it is selected
 (even if it is the current normal generator) and when ‘kind’ is
 changed.
Xi'an
fuente
3
logΦ1Φ1X1X2Ui1101
whuber
2
R 3.0.2rowSumsSqnorm(runif(N))InverseCDF[NormalDistribution[], #] &
1
Estoy de acuerdo, qnorm(runif(N))es incluso un 20% más rápido quernorm(N)
Xi'an
3
Φ1pecadocossería tan eficiente, también los usaría en lugar del muestreo de rechazo.
whuber
1
A modo de comparación, utilizando un i7-3740QM @ 2.7Ghz y R 3.12, para las siguientes llamadas: 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)obtengo mean 11.38363 median 11.18718por inversión y mean 13.00401 median 12.48802por Box-Muller
Avraham el