逆变换采样的方法确实有效,但其实它的缺点也是很明显的,那就是有些分布的CDF可能很难通过对PDF的积分得到,再或者CDF的反函数也很不容易求。这时可能需要用到另外一种采样方法,这就是下面即将要介绍的拒绝采样(Reject Sampling)。
图3-7 拒绝采样的原理
图3-7阐释了拒绝采样的基本思想。假设对PDF为 p ( x )的函数进行采样,但是由于种种原因(例如这个函数很复杂),对其进行采样是相对困难的。但是另外一个PDF为 q ( x )的函数则相对容易采样,例如采用逆变换方法可以很容易对对它进行采样,甚至 q ( x )就是一个均匀分布(别忘了计算机可以直接进行采样的分布就只有均匀分布)。那么,当我们将 q ( x )与一个常数 M 相乘之后,可以实现如图3-7所示关系,即 M · q ( x )将 p ( x )完全“罩住”。
然后重复如下步骤,直到获得 m 个被接受的采样点:
(1)从 q ( x )中获得一个随机采样点 x i ;
(2)对于 x i 计算接受概率(acceptanceprobability)
(3)从 U (0,1)中随机生成一个值,用 u 表示;
(4)如果 α ≥ u ,则接受 x i 作为一个来自 p ( x )的采样值,否则就拒绝 x i 并回到第一步。
如图3-8所示,所选择的参考分布是均匀分布(当然也可以选择其他的分布,但采用均匀分布显然是此处最简单的一种处理方式)。而且令常数 M =3。
图3-8 拒绝采样示例
下面给出R中的示例代码,易见此处采样点数目为10 000。
图3-9 程序执行结果
上述代码的执行结果如图3-9所示,可见采样结果是非常理想的。