拒绝采样
在开始讨论之前,需要明确一个前提,我们想要生成一组服从分布 Q Q Q的样本,那么我们首先要知道如何从另一个分布 P P P中采样,通过对 P P P分布样本的“改造”, 我们可以得到 Q Q Q分布的样本。例如,接下来我们会探讨,如何基于均匀分布来生成正态分布。至于均匀分布如何生成,这就是伪随机数生成算法所研究的问题,不在本文的范畴之内。
下图中,绿色是均匀分布U(-4, 4)的样本直方图,右边是正态分布N(0, 1)的样本直方图:
[注]:由于N(0,1)在[-4, 4]之外几乎没有样本存在 (回忆一下 3 σ 3\sigma 3σ原则),因此我们只生成落在[-4, 4]范围内的样本,依然可以作为很好的近似。
\qquad \qquad \qquad \qquad \qquad \qquad
那么一个很自然的想法是,如果我们把上图中的均匀分布的样本直方图砍掉一部分,就可以得到正态分布的样本直方图。等价地说,如果我们把均匀分布的样本,在各个取值处,按照比例只接受一部分样本,其余的舍弃,那么保留下来的样本就服从正态分布了。这个比例应该怎么求呢?相信大家已经想到了,这里我们需要用到两个分布的密度函数。
我们按照第二节的思路,将随机数的取值范围均匀分割成M份,我们考察 i , j i, j i,j两个区间, s i , s j s_i,s_j si,sj分别为区间 i , j i, j i,j的中点, u i , u j u_i,u_j ui,uj分别为均匀分布的样本落在 i , j i, j i,j内的个数, n i , n j n_i, n_j ni,nj分别为正态分布的样本落在 i , j i, j i,j内的个数。那么根据第二节的讨论,某处的样本个数正比于此处的密度函数取值,可以得到:
u i u j = U ( − 4.4 ) ( s i ) U ( − 4 , 4 ) ( s j ) = 1 n i n j = N ( 0 , 1 ) ( s i ) N ( 0 , 1 ) ( s j ) = 1 2 π e x p ( s i 2 2 ) 1 2 π e x p ( s j 2 2 ) \begin{aligned} \frac{u_i}{u_j} &= \frac{U(-4. 4)({s_i})}{U(-4,4)({s_j})} =1 \\[2ex] \frac{n_i}{n_j}&= \frac{N(0, 1)({s_i})}{N(0, 1)({s_j})} = \frac{\frac1{\sqrt{2\pi}}exp(\frac{s_i^2}2)}{\frac1{\sqrt{2\pi}}exp(\frac{s_j^2}2)} \end{aligned} ujuinjni=U(−4,4)(sj)U(−4.4)(si)=1=N(0,1)(sj)