[Math]服从高斯分布的随机生成器

组里的同事突然问我如何生成服从高斯的随机生成器。

想当然的就感觉给定高斯函数,然后利用rand()的均匀分布产生的随机数,来模拟。

总感觉有点问题。


然后调查了一番,感觉还是有点东西需要记录,算是再学习吧。

1) 按照中心极限定理,对于独立同分布的随机变量之和逼近于正态分布。

这样就可以用rand()生成的随机数,有限次相加就可以逼近正态分布了。

加上平均值和偏差也就可以模拟服从高斯分布的随机数了。

 

2)由于上述需要多次相加,计算量比较大。由此有另外一种方法就是

使用Box-Muller Transformation.

将两个独立生成的服从均匀分布的随机数U1,U2(0,1之间)。进行如下转换

z_0 = \sqrt{-2 \ln U_1} \cos(2 \pi U_2) = \sqrt{-2 \ln s} \left(\frac{u}{\sqrt{s}}\right) = u \cdot \sqrt{\frac{-2 \ln s}{s}}

z_1 = \sqrt{-2 \ln U_1} \sin(2 \pi U_2) = \sqrt{-2 \ln s}\left( \frac{v}{\sqrt{s}}\right) = v \cdot \sqrt{\frac{-2 \ln s}{s}}.

即服从两个独立的正态分布。

u,v为极坐标,s为平方和开根号(半径)

s与U1对应,\scriptstyle \theta/(2 \pi)与U2对应。

 

为啥经过这个变化就可以直接得到服从正态分布的数呢。

根据Marsaglia polar method

If u is uniformly distributed in the interval 0 ≤ u < 1, 
then the point (cos(2πu), sin(2πu)) is uniformly distributed on the unit circumference x2 + y2 = 1,
and multiplying that point by an independent random variable ρ whose distribution is

\Pr(\rho<a)=\int_0^a re^{-r^2/2}\,dr

will produce a point

 \left(\rho\cos(2\pi u),\rho\sin(2\pi u)\right)

whose coordinates are jointly distributed as two independent standard normal random variables.

此处的u即为上述的服从均匀分布的U2

而rho,正好是上述U1的chi-2距离。正好服从上述分布

\Pr(\rho<a)=\int_0^a re^{-r^2/2}\,dr

那么就说明,产生的两个点z0,z1服从独立的正态分布。

 

而至于Marsaglia polar method方法的证明,我没有直接找到。

经过一些相关的资料,可以发现,使用Inverse transform sampling的概念,

生成点函数的反函数的Jacobian行列式为高斯密度函数,可以推导出此函数即服从于高斯分布。

(可能理解还有偏差,如有不对请高人指点)

具体证明请参照下一篇续-修改@2010.11.2

posted @ 2010-10-25 23:11  JimmyQi  阅读(4603)  评论(1编辑  收藏  举报