Skip to main content

4.3 对分布p(x)p(x)进行采样

由上节的内容可知,蒙特卡洛方法涉及两个基本的步骤:采样和求平均值,本节就讨论几种不同采样方法。

首先我们定义什么是采样,考虑一个定义域空间Ω0\Omega_0以及一个概率密度函数p(x)p(x),其中xΩ0x\in\Omega_0,满足:

Ω0p(x)dx=1 {\rm \int}_{\Omega_0}p(x){\rm d}x=1

(式1

采样的过程是这样一个算法,它能够从p(x)p(x)对应的随机变量XX中产生一系列随机数X1,X2,...X_1,X_2,...,使对于任意ΩΩ0\Omega\in\Omega_0满足:

P{XkΩ}=Ωp(x)dx1 P\{X_k\in\Omega\}={\rm \int}_{\Omega}p(x){\rm d}x\leq 1

(式2

实际上我们不能直接从p(x)p(x)产生随机数,在计算机程序中这个过程必须要求首先具有某些基础随机数的一个序列。我们可以借助计算机操作系统提供的random(u){\rm random}(u)函数来产生一个均匀分布的随机数,又称为伪随机数(pseudorandom numbers), 定义这些随机数的值为ξ1,ξ2,\xi_1,\xi_2,\cdots,它们可以用来作为采样所需的基础随机数。

逆变换算法

逆变换算法是1947年由乌拉姆提出的,它的定义如下:设XX是连续随机变量,其累计分布函数为PXP_X,如果随机变量YY是一个[0,1][0,1]上的均匀分布,则随机变量PX1(Y)P^{-1}_X(Y)具有和XX一样的概率分布。

逆变换算法的直观解释可以由图(1)得出,图中dydy表示的随机变量是[0,1]上的均匀分布,由式[ref eq:mc-continuous-pdf]可知,随机变量XX中的值落于dx{\rm d}x区间的概率p(x)=dP(x)dx=dydxp(x)= \cfrac{{\rm d}P(x)}{{\rm d}x}= \cfrac{{\rm d}y}{{\rm d}x},所以YY上的均匀分布被映射到满足p(x)p(x)的随机变量XX上。

图(1):逆变换算法将一个满足[0,1]上的均匀分布的随机变量YY,通过X=P1(Y)X=P^{-1}(Y)映射到满足概率分布p(x)p(x)的随机变量XX

以下我们以一个离散分布的例子来进一步解释逆向变换算法的过程,设一个离散随机变量具有4个可能的值,其对应的概率分别为:p1,p2,p3p_1,p_2,p_3p4p_4 ,这些概率满足:i=14pi=1\sum_{i=1}^{4}p_i=1, 该随机变量对应的概率密度函数如图(2)所示。

图(2):一个具有4个输入事件的离散随机变量的概率密度分布,每个随机数xix_i的概率为pip_i

为了使用逆变换算法从一个任意分布中进行采样,首先需要求出其对应的累积分布函数 P(x)P(x),对于连续随机变量,PPpp在全定义域上的积分,对于离散随机变量,可以使用前iipp的值的和作为P(xi)P(x_i)的值,如图(3)所示。注意,为了满足所有随机事件的概率之和为1,最右边的条的高度应该为1。

图(3):从离散随机变量的概率密度函数pp构建概率分布函数PP的过程,[0,1][0,1]上均匀分布的随机数ξ\xi被按照概率分布映射到离散随机变量XX

在图(3)中,一个标准的[0,1][0,1]上的均匀分布的随机变量分布在纵坐标上,通过在水平方向上延伸ξ\xi可以和具有概率pip_i的第ii个输入事件相交,因为ξ\xi是服从均匀分布的,所以具有更大概率的p3p_3p4p_4拥有更多的机会被选择,所以通过这样的方式,[0,1][0,1]上的均匀分布ξ\xi被完全变换为服从概率密度函数p(x)p(x)的离散随机变量XX

通过上述的示例,我们可以推导出使用逆变换算法从一个概率密度函数p(x)p(x)产生随机数XiX_i的步骤:

  1. 首先计算p(x)p(x)的累计分布函数:P(x)=0xp(x)dxP(x)={\rm \int}_{0}^{x}p(x^{'}){\rm d}x^{'}
  2. 其次计算累计分布函数的反函数:P1(x)P^{-1}(x)
  3. 然后从一个[0,1][0,1]上的均匀分布产生一个随机数ξ\xi
  4. 最后将随机数ξ\xi代入P(x)P(x)的反函数求出满足p(x)p(x)分布的随机数:Xi=P1(ξ)X_i=P^{-1}(\xi)

取舍算法

在许多情况下,逆变换算法无法被使用:首先是某些累积分布函数无显式解析表达式,因此写不出反函数,例如某些概率密度函数没有边界,不能归一化;其次是反函数无显式表达式,因此解不出反函数;再次是在整个求累积分布函数和反函数的过程中,这里面可能涉及大量初等函数的计算,因此采样成本很高。

为了在计算机中对任意分布函数进行采样,冯·诺伊曼于1947年提出了取舍算法(acceptance-rejection method),这种方法不需要对概率分布函数执行归一化,并且它通常只需要直接使用计算机系统提供的均匀分布的随机数ξ\xi即可。

取舍算法的思路很简单,它和本章开头讲述的蒲丰投针(如图[ref f:mc-pi]所示)实验的原理类似,考虑一个任意函数f(x)f(x)(注意,这里的f(x)f(x)实际上是一个分布函数,然后在取舍算法中它通常并不是归一化的,因此我们偏向于称其为更具广泛意义的函数f(x)f(x)而不是归一化的p(x)p(x)。)被限定在[a,b][a,b]区间,在此区间外的所有值均为0,如图(4)所示。

图(4):取舍算法在一个能够完全包围住f(x)f(x)的空间上均匀采样,然后选择(接受)处于函数f(x)f(x)范围内的采样值用来作为采样值,其他值则被抛弃(拒绝)

在这种情况下产生一个随机变量Yf(x)Y\sim f(x)的过程非常直观,它可以被描述为以下接受-拒绝的过程:

  1. 产生一个[a,b][a,b]上均匀分布的随机数:XU(a,b)X\sim U(a,b)
  2. 产生一个[0,c][0,c]上独立于XX的均匀分布的随机数:YU(0,c)Y\sim U(0,c)(cc是函数f(x)f(x)的最大值)。
  3. 如果Yf(X)Y\leq f(X),则接受,接受的随机数为Z=XZ=X,否则XX被拒绝,算法返回到第一步重新产生新的随机数。

需要注意的是,每次采样产生的随机数矢量(X,Y)(X,Y)实际上是均匀地分布于一个矩形区域[a,b]×[0,c][a,b]\times [0,c],因此被接受的随机数矢量(X,Y)(X,Y)则会均匀分布于函数f(x)f(x)以下的区域,这意味着被接受的随机数XX服从概率分布f(x)f(x)

图(5):为了减少被拒绝的采样值的数量,使用一个接近f(x)f(x)而不是cc的函数ϕ\phi来包围f(x)f(x)

取舍算法的缺点是其效率比较低,因为在接受一个随机数之前,大量的随机数被拒绝了。为了减少被拒绝的随机数的数量,实践上通常使用一个建议分布(proposal distribution)ϕ(x)=Cg(x)\phi (x)=Cg(x)来逼近f(x)f(x)(称为目标分布)的分布,其中g(x)g(x)是一个简单的函数,它通常能够比较容易的(例如使用逆向变换算法)产生随机数常数CC用来保证ϕ(x)\phi (x)能够完全覆盖f(x)f(x),即:ϕ(x)f(x)\phi (x)\geq f(x),如图(5)所示。所以上述的取舍算法可以写为:

  1. 产生随机数:Xg(x)X\sim g(x)
  2. 产生随机数:YU(0,Cg(X))Y\sim U(0,Cg(X))
  3. 如果Yf(X)Y\leq f(X), 则接受随机数:Z=XZ=X,否则返回第一步。

取舍方法不需要对函数执行归一化,只需要找到一个能够覆盖该分布函数的更简单的分布(建议分布)即可,例如对于:

f(x)=2π(1x2)12,0<x<1 f(x)= \cfrac{2}{\pi(1-x^2)^{ \frac{1}{2}}},0<x<1

(式3

可以使用更简单的建议分布函数:

g(z)=12(1z)12 g(z)= \cfrac{1}{2(1-z)^{ \frac{1}{2}}}

(式4

注意,虽然对于一维的函数,取舍算法需要产生两个随机数来做取舍判断,但是由于它减少单次采样的计算成本,因此它和逆向变换算法仍然具有可比性。

随机变量的变换

在前面讨论逆向变换算法的时候,我们介绍了一种技术,它可以将一个满足均分分布的随机变量转换为一个满足任意分布的随机变量。本节,我们将讨论与之相关的一个更一般的问题:即将满足任意分布的一个随机变量转换为满足另一个分布的随机变量。

假设随机变量XX的累积分布函数为FX(x)F_X(x),以及概率分布函数为fX(x)=dFXdxf_X(x)= \cfrac{{\rm d}F_X}{{\rm d}x},另一个随机变量Y=y(X)Y=y(X)是关于xx的连续单调递增函数,如图 (6)(a)所示,我们的目标是求出YY的累积分布函数FY(y)F_Y(y)的形式。

单调递增单调递减

图(6):yy是一个连续函数,其中(a)是关于xx的单调递增函数,(b)是关于xx的单调递减函数

由于YY是单调递增的,因此有:

y(X)y(x), if Xx y(X)\leq y(x), \text{ if } X\leq x

(式5

所以YY的概率为:

P{y(X)=Yy(x)}=P{Xx} P\{y(X)=Y\leq y(x)\}=P\{X\leq x\}

(式6

或者写成:

FY(y)=FX(x) F_Y(y)=F_X(x)

(式7

XXYY的概率分布函数之间的关系,可以通过对式(7)两边求微分得出:

fY(y)dydx=fX(x) f_Y(y) \cfrac{{\rm d}y}{{\rm d}x}=f_X(x)

(式8

现在假设y(X)y(X)是关于XX的单调递减函数,如图(6)(b)所示,根据上面类似的推导过程,得到:

fY(y)dydx=fX(x) f_Y(y) \cfrac{dy}{dx}=-f_X(x)

(式9

所以随机变量XXYY之间概率分布函数之间的关系为(通过组合式(8)和式(9)):

fY(y)=dydx1fX(x) f_Y(y)=| \cfrac{dy}{dx}|^{-1}f_X(x)

(式10

上式反映出这样一个事实,即XXdx{\rm d}x区间的所有值被映射到YYdy{\rm d}y区间内,如图(7)所示。

图(7):XXdxdx区间的所有值被映射到YYdydy区间内