Box-Muller与逆CDF方法相比在模拟正态分布方面的优势?


15

为了从一组均匀变量中模拟正态分布,有几种技术:

  1. Box-Muller算法,其中一个对上的两个独立均匀变量进行采样,然后通过以下方法将它们转换为两个独立的标准正态分布: Ž 0 = (0,1)

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. CDF方法,其中可以将普通cdf等同于一个统一变量: 并得出 F Z = U Z = F 1U Fž

    Fž=ü
    ž=F-1ü

我的问题是:哪个计算效率更高?我认为这是后者的方法-但是我阅读的大多数论文都使用Box-Muller-为什么?

附加信息:

正常CDF的逆是已知的,并给出:

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

因此:

Z=F1(U)=2erf1(2U1),U(0,1).

1
普通CDF的逆函数是什么?仅当使用分段线性函数近似原始CDF时,才能进行解析计算。
Artem Sobolev 2015年

两者不是密切相关吗?我认为Box Muller是2变量生成的一个特例。
ttnphns

嗨,Barmaley,我在上面添加了更多信息。逆CDF有一个表达式-但是必须通过计算来计算-因此,这也许就是为什么最好使用Box Muller的原因?我假设 erf 1将在查找表中计算,非常类似于sincosine的值?因此,计算量还不那么贵吗?我可能是错的。erf1erf1sincosine
user2350366 2015年

2
有没有罪和余弦的Box-Muller版本。
西安

2
@Dilip对于非常低精度的应用程序,例如计算机图形学,正弦和余弦的确可以通过使用合适的查找表进行优化。但是,对于统计应用程序,永远不会使用这种优化。最终,计算并不比logsqrt真正困难,但是在现代计算系统上,与exp相关的基本函数-包括trig函数-倾向于被优化(coslog是Intel的基本指令) 8087芯片!),而erf不可用或已被编码为较高(较慢)的级别。erf1logsqrtexpcoslog
ub

Answers:


16

从纯粹的概率角度来看,这两种方法都是正确的,因此是等效的。从算法角度来看,比较必须同时考虑精度和计算成本。

Box-Muller依靠统一发电机,成本与该统一发电机大致相同。正如我的评论中所提到的,如果没有对数,您就可以不用正弦或余弦调用而逃脱:

  • 生成,直到小号= Ü 2 1 + Ü 2 21
    U1,U2iidU(1,1)
    S=U12+U221
  • 并定义X1=ZU1Z=2log(S)/S
    X1=ZU1, X2=ZU2

通用的反演算法要求调用反正态cdf,例如qnorm(runif(N))在R中,这可能比上述方法更昂贵,更重要的是,在精度方面可能会失败,除非分位数函数的编码正确。

遵循whuber的评论,在执行时,rnorm(N)和的比较都有qnorm(runif(N))利于cdf的倒数:

> 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` `

并且在合身方面: enter image description here

Radford Neal在我的博客上发表评论之后,我想指出rnormR 中的默认值使用了反转方法,因此,上述比较反映在接口上,而不是模拟方法本身!引用有关RNG的R文档:

‘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.

3
logΦ1Φ1X1X2Ui1101

2
R 3.0.2rowSumsSqnorm(runif(N))InverseCDF[NormalDistribution[], #] &

1
我同意,qnorm(runif(N))甚至比rnorm(N)
西安

3
Φ1sincos

1
为了进行比较,使用i7-3740QM @ 2.7Ghz和R 3.12,进行以下调用: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)我得到mean 11.38363 median 11.18718了反转和mean 13.00401 median 12.48802Box-Muller的数据
Avraham 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.