科普向-计算机如何生成随机数?(第二期)

一、引言

在上期中,我们介绍了LCG和逆变换法,了解了区间上的均匀分布,多点分布以及一些简单分布函数的生成。本期我们将把情况推向更为一般的情况,讲介绍正态分布的生成,以及舍选法生成一般概率分布函数的分布。

二、正态分布

对于正态分布 N(0,1) 的概率密度和分布函数:

p(x)d(x)=\frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}

F(x)=\int_{-\infty}^{x}p(y)d(y)=\int_{-\infty}^{x}\frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy

直接计算上述积分是不太容易的,因此利用在概率论中学习过的计算方法,我们考虑二维正态分布N(0,I_2),这个二维的正态分布的分布函数如下:

\int_{\mathbb{R}^2}\frac{1}{2\pi}e^{-\frac{x^2}{2}}e^{-\frac{y^2}{2}}dxdy

考虑极坐标变换:x=rcos\theta ,\,\,\,y=rsin\theta, \,\,\,\text{at the same time:}\,\,dxdy=rdrd\theta

可以得到:

\int_{\mathbb{R}^2}\frac{1}{2\pi}e^{-\frac{x^2}{2}}e^{-\frac{y^2}{2}}dxdy=\int_{0}^{+\infty}dr\int_{0}^{2\pi}d\theta\frac{1}{2\pi}e^{-r^2}r=1

受此启发, 就得到了Box-Muller变换原理:

X \sim N(0,1),\,\,Y \sim N(0,1) \Rightarrow (X,Y) \sim N(0,I_2)

做变换:

\left\{\begin{matrix} X=Rcos\Theta \\ Y=Rsin\Theta \end{matrix}\right.\,\,\Rightarrow \Theta\sim \mathcal{U}[0,2\pi],\,\,R\sim Rayleigh

p(x,y)dxdy=\frac{1}{2\pi}d\theta \, e^{-\frac{r^2}{2}}rdr

其中:

\theta\sim \mathcal{U}[0,2\pi]\Rightarrow \int_{0}^{2\pi}d\theta=1\\\\\ F(r)=\int_{0}^{r}e^{-\frac{s^2}{2}}sdr=-e^{-\frac{s^2}{2}}|_0^r=1-e^{-\frac{r^2}{2}}\Rightarrow \,\,\int_{0}^{+\infty}e^{-\frac{s^2}{2}}sdr=1

我们设  1-e^{-\frac{r^2}{2}}=t,可以反解出:

1-e^{-\frac{r^2}{2}}=t \,\,\,\Rightarrow \,\,\,1-t=e^{-\frac{r^2}{2}}\,\,\,\Rightarrow \,\,\,r=\sqrt{-2logt}

因此我们只需生成两个均匀分布:\Theta_n \sim \mathcal{U}[0,2\pi]\quad T_n\sim \mathcal{U}[0,1], 就可以得到R_n以及X_n

R_n=\sqrt{-2logT_n},\,\,\,X_n=R_ncos\Theta_n

这样就生成了一维正态分布,事实上可以看成二维正态分布的一个切片。

所以我们利用这种方法其实是得到了一个二维正态分布:

R_n=\sqrt{-2logT_n},\,\,\,X_n=R_ncos\Theta_n,\,\,\,Y_n=R_nsin\Theta_n

三、舍选法

1、舍选法介绍

舍选法的直观理解如下:

我们在[a,b]\times[0,c]这个区域上生成均匀分布,之后只保留其中y \in [0,p(x)]中的点,这样我们就生成了以p(x)为概率密度的分布。

那么为什么上面的这个“去掉一个部分”的操作可以保证分布还是均匀的呢?换句话说p(x)围成的区域中的点对于 x 应该还是均匀的,这样才可以保证生成的是以p(x)为概率密度的分布。下面的定理保证了这一点:

Thm 3,1 

\text{If} \,\,(X,Y) \sim \mathcal{X}_A(x,y)dxdy,\,\,\text{then}\,\,X\sim p(x)dx\\\\ \text{where }\mathcal{X}_A \,\,\text{is a Indicator function}\\\\p.f.\quad \text {Consider a marginal distribution} \,\,p(x) \\\\p(x)=\int_{\mathbb{R}}p(x,y)dy=\int_{0}^{p(x)}1dy=p(x) _{\quad \square }

2、舍选法的操作过程

Step 1:生成均匀分布

生成区间[a,b]\times[0,c]上的均匀分布(X,Y)\sim \mathcal{U}([a,b]\times[0,c])

Step 2: 做出取舍

\text{If}\,\,\left\{\begin{matrix} Y>p(x)&\text{Reject }\\ Y\leq p(x)&\text{Accept} \end{matrix}\right.

3.如何选取“覆盖”函数

事实上,选取均匀分布作为概率密度函数的覆盖是有局限性的。比如像指数分布的概率密度函数或者下图所示概率密度函数就没法完全覆盖住,因为会涉及到 p(x)\rightarrow 0\quad (x\rightarrow +\infty\,\, \text{or}\, -\infty )

对于这种情况,我们一般选取rescaled Cauchy function(类似上图中的红线),这是一个关于 x_0对称,并且最高点在 x_0 处取到 a_0:

f(x)=\frac{c_0}{1+(x-x_0)^2/a_0^2}=c_0p(\frac{x-x_0}{a_0})

事实上,我们可以调整x_0,\,\,a_0,\,\,\text{and} \,\,c_0的大小,使这个函数处处比p(x)要大,即可以很好的覆盖住p(x),具体的证明这里就不详细证明了。

而上述f(x)的生成我们很容易利用逆变换法生成:

f(x)=\frac{c_0}{1+(x-x_0)^2/a_0^2}=y \Rightarrow x=\sqrt{\frac{c_0a_0}{y}-a_0}+x_0

这样我们只需要生成 Y\sim\mathcal{U}[0,c_0] 就可以得到 f(x) 所覆盖区域下的分布,在利用舍取法就可以筛选出以 p(x) 为概率密度的分布。

四、结语

到此我们就讲了从特殊到一般的随机数生成方法,希望可以对大家有所启发。如果有别的方法没有提及的也可以分享给我!感谢大家看到这里,在这里祝各位中秋快乐!如果有不严谨以及错误的地方欢迎各位大佬指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值