八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

蒙特卡洛积分法(二)

Posted on 2020-01-11 15:15  闪之剑圣  阅读(1806)  评论(0编辑  收藏  举报

上一次我们谈到,使用蒙特卡洛积分法求积分涉及到两个问题:1.如何对一个任意分布函数进行抽样; 2.如何减少方差。这里我们先来探讨第一个问题,给定一个概率密度函数,如何对其进行采样,使采样满足其概率分布。
平常有两种方法实现:

1.逆变换算法

假设我们有一个概率分布函数p(x),对它取积分,可以得到它累积分布函数P(x),这个函数根据性质我们知道它的值域是一定分布在[0,1]区间的。那么通过它的反函数就可以实现输入[0,1]之间的随机数,得到符合概率密度分布的采样点。
我们可以从一个离散分布的图像中来加深理解,下图是一个离散分布函数p(x):

它的累积分布函数如下:

可以看到,当我们取值域上的一点ξ,它对应的定义域值为3。p(3)的值较大,因此它也就有更多几率被采样到。也就是说对于,输入一个均匀采样的[0,1]值,就可以得到符合p(x)概率分布的定义域采样点。
因此逆变换算法的过程如下:
1.首先计算p(x)的累积分布函数
2.计算累积分布函数的反函数
3.然后在[0,1]均匀分布随机产生一个随机数ξ
4.最后将ξ带入中求出满足p(x)分布的随机数。

2.取舍算法

当累计分布函数或其反函数没有显示的解析表达式,或者概率密度函数没有边界,不能归一化的时候,逆变换算法就无法使用,此时应当使用取舍算法。
取舍算法的思路非常简单,假设一个任意函数f(x)被限定在[a,b]区间,在此区间外的所有值均为0,我们想对它进行采样。我们有一个概率分布函数p(x)使得cp(x)>f(x),那么取舍法的过程如下:
1.产生一个均匀分布在[a,b]的随机数x
2.产生一个均匀分布在[0,cp(x)]上的随机数y
3.若y<f(x),则接受这个采样,否则继续产生新的随机数
下图是f(x)和p(x)的示意图。其实这个方法就是要判断生成的随机数是否在f(x)的范围以内。