[转]基于Box–Muller变换的正态随机数生成方法基于Box–Muller变换的正态随机数生成方法
[转]基于Box–Muller变换的正态随机数生成方法
为什么我的眼里常含泪水?因为我有一个算法不会。为了节约点眼泪,今天我们就来介绍著名的Box–Muller变换,基于这种变换,我们便可以得到一个从均匀分布中得到正态分布采样的算法,本文也会详细解释其中蕴含的数学原理。
Box–Muller变换最初由 George E. P. Box 与 Mervin E. Muller 在1958年提出。George E. P. Box 是统计学的一代大师,统计学中的很多名词术语都以他的名字命名。Box 之于统计学的家学渊源相当深厚,他的导师是 统计学开山鼻祖 皮尔逊的儿子,英国统计学家Egon Pearson,同时Box还是统计学的另外一位巨擘级奠基人 费希尔 的女婿。统计学中的名言“all models are wrong, but some are useful”(所有模型都是错的,但其中一些是有用的)也出自Box之口。
我们在之前的文章(http://blog.csdn.net/baimafujinji/article/details/51407703)中曾经谈过,本质上来说,计算机只能生产符合均匀分布的采样。如果要生成其他分布的采样,就需要借助一些技巧性的方法,例如我们在前面的文章提到过的逆变换采样、拒绝采样以及自适应的拒绝采样等等。而在众多的“其他分布”中,正态分布无疑占据着相当重要的地位。下面这个定理,就为我们生成符合正态分布的采样(随机数)提供了一种方法,而且这也是很多软件或者编程语言的库函数中生成正态分布随机数时所采样的方法。
定理(Box-Muller变换):如果随机变量U1和U2是IID的,且U1,U2 ~Uniform[0, 1],则
Z0和Z1独立且服从标准正态分布。
如何来证明这个定理呢?这需要用到一些微积分中的知识,首先回忆一下二重积分化为极坐标下累次积分的方法:
假设现在有两个独立的标准正态分布 X~N(0,1) 和 Y~N(0,1),由于二者相互独立,则联合概率密度函数为
做极坐标变换,则x=Rcosθ,y=Rsinθ,则有
你可以看到这个结果可以看成是两个概率分布的密度函数的乘积,其中一个可以看成是[0, 2π]上均匀分布,将其转换为标准均匀分布则有θ ~Unif (0, 2π)=2π U2。
另外一个的密度函数为
则其累计分布函数CDF为
这个CDF函数的反函数可以写成
根据逆变换采样的原理,如果我们有个PDF为P(R)的分布,那么对齐CDF的反函数进行均匀采样所得的样本分布将符合P(R)的分布,而如果 u 是均匀分布的,那么 U1 = 1-u 也将是均匀分布的,于是用 U1 替换1-u,最后可得
结论得证。最后我们来总结一下利用Box-Muller变换生成符合高斯分布的随机数的方法: