生成随机变量的方法
来自《Stochastic Numerical Methods: An Introduction for Students and Scientists》的总结。
用累积分布函数的逆
仅对较简单的一维分布有效。可能需要牛顿法辅助解。
线性化法
如果累积分布函数\(F\)求逆困难,可以考虑如下方法:
- 在\([0,1]\)中取\(N\)个等分的点\(i/N\)
- 对这些点用精确方法(牛顿法等)求出相应的值\(x_i\)
- 对其它的\([0,1]\)中的点,用相应小区间的值线性组合,这只需要一个简单的加权和就能完成
需要考虑的是无穷区间上的两个端点区间的处理,可以采用截断(如果那些概率很小)或者其它方法。
也可以考虑用分段线性函数近似累积分布函数\(F\),但是前述方法优势在于:得到\([0,1]\)中的随机值时,决定属于哪个小区间非常简单。
变量代换
该部分略去不表。
需要注意的例子:
- Box–Muller–Wiener算法。用于生成多维高斯正态分布。
- 其它根据(等价的)定义生成方法。
组合法
如果pdf可以写为多个pdf的非负加权和\(F=\sum p_i F_i\),则可以如下生成随机变量的取值:
- 按概率\(p_i\)生成取值\(N\)的随机变量
- 根据上一步生成的随机变量,取对应的pdf \(F_i\),根据该pdf生成一个取值
注意,这里都是pdf而非cdf,可用于多维。该方法的关键在于适当地划分pdf。
拒绝法
该方法是组合法的反面。
假设在组合法中,某一个pdf\(F_i\)是我们感兴趣的,但不容易生成,而总的分布\(F\)是容易生成的。我们可以如下生成\(F_i\):
- 根据\(F\)生成随机变量\(x\)
- 根据概率\(P(\hat{z}=i | x)\)接受这个生成的值
可以这么理解:
- 仍然按照组合法生成随机变量\(x\),我们将每个子pdf生成的值放在一起\({x_i}\),分层摆放在架子上
- 目标是只取需要的某一层架子上的随机变量值
- 我们从总的架子上随便取一个,然后根据条件概率拿下来,这样和目标层的分布就是一致的
拒绝法
换个角度,对于pdf\(f\),当我们生成值的时候,重要的是对任意值\(x、y\),保持\(f(x)/f(y)\)这个比例。于是我们可以如下做:
- 根据某个pdf\(g\),生成值\(x\)
- 按照某个概率\(h(x)\)接受值,只要\(gh \varpropto f\)
注意对\(g、h\)的选择不是任意的,必须满足\(0 \leq h \leq 1\)。
平均接受概率度量了拒绝法的效率,它是 \(\epsilon = \int hg\),我们希望这个值越大越好,通常,这要求\(g\)的形状接近于\(f\),\(h\)尽量取较大值。
对于离散随机变量,我们也可以使用拒绝法。对于不好生成的离散的\(g\),我们可以定义\(\hat{z}\),使得\(floor(\hat{z})=z\),同时\(\hat{z}\)在\([n,n+1)\)中均匀取值。然后使用拒绝法。

浙公网安备 33010602011771号