D'un point de vue purement probabiliste, les deux approches sont correctes et donc équivalentes. D'un point de vue algorithmique, la comparaison doit considérer à la fois la précision et le coût de calcul.
Box-Muller s'appuie sur un générateur uniforme et coûte environ le même prix que ce générateur uniforme. Comme mentionné dans mon commentaire, vous pouvez vous en sortir sans appels sinus ou cosinus, sinon sans le logarithme:
- générer jusqu'à S = U 2 1 + U 2 2 ≤ 1
U1,U2∼iidU(−1,1)
S= U21+ U22≤ 1
- prendre et définissezX1=ZU1Z= - 2 log( S) / S----------√
X1= ZU1, X 2= ZU2
L'algorithme d'inversion générique nécessite l'appel au cdf normal inverse, par exemple qnorm(runif(N))
dans R, qui peut être plus coûteux que ce qui précède et plus important peut échouer dans les queues en termes de précision, à moins que la fonction quantile ne soit bien codée.
Pour suivre les commentaires de whuber , la comparaison rnorm(N)
et qnorm(runif(N))
l'avantage de l'inverse du cdf, tant en temps d'exécution:
> 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` `
et en termes d'ajustement dans la queue:
Suite à un commentaire de Radford Neal sur mon blog , je tiens à souligner que la valeur rnorm
par défaut dans R utilise la méthode d'inversion, d'où que la comparaison ci-dessus se reflète sur l'interface et non sur la méthode de simulation elle-même! Pour citer la documentation R sur 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.