转:> https://blog.csdn.net/u010159842/article/details/78959515函数
蒙特卡洛(Monte Carlo)方法是二十世纪四十年代中期因为科学技术的发展和电子计算机的发明,而被提出的一种以几率统计理论为基础的数值计算方法。它的核心思想就是使用随机数(或更常见的伪随机数)来解决一些复杂的计算问题。spa
当所求解问题能够转化为某种随机分布的特征数(好比随机事件出现的几率,或者随机变量的指望值等)时,每每就能够考虑使用蒙特卡洛方法。经过随机抽样的方法,以随机事件出现的频率估计其几率,或者以抽样的数字特征估算随机变量的数字特征,并将其做为问题的解。这种方法多用于求解复杂的高维积分问题。.net
实际应用中,咱们所要面对的第一个问题就是如何抽样?在统计学中, 抽样(或称采样)是指从目标整体中抽取一部分个体做为样本的过程。orm
例如,咱们想知道一所大学里全部男生的平均身高。可是由于学校里的男生可能有上万人之多,因此为每一个人都测量一下身高可能存在困难,因而咱们从每一个学院随机挑选出100名男生来做为样本,这个过程就是抽样blog
可是在计算机模拟时,咱们所说的抽样,实际上是指从一个几率分布中生成观察值(observations)的方法。而这个分布一般是由其几率密度函数(PDF)来表示的。并且,即便在已知PDF的状况下,让计算机自动生成观测值也不是一件容易的事情。从本质上来讲,计算机只能实现对均匀分布(Uniform distribution)的采样。事件
具体来讲,咱们可能要面对的问题包括:get
比较简单的一种状况是,咱们能够经过PDF与CDF之间的关系,求出相应的CDF。或者咱们根本就不知道PDF,可是知道CDF。此时就可使用Inverse CDF的方法来进行采样。这种方法又称为逆变换采样(Inverse transform sampling)。数学
若是你对PDF和CDF的概念有点模糊,咱们不妨先来一块儿回顾一下它们的定义。对于随机变量$X$,以下定义的函数 $F$: $$F(x)=P{X<= x}, -\infty < x < \infty$$ 称为 $X$ 的累积分布函数(CDF,Cumulative Distribution Function)。对于连续型随机变量 $X$ 的累积分布函数 $F(x)$,若是存在一个定义在实数轴上的非负函数 $f(x)$,使得对于任意实数 $x$,有下式成立: $$F(x)=\int_{-\infty}^{\infty}{f(t)}dt$$it
则称 $f(x)$ 为 $X$ 的几率密度函数(PDF,Probability Density Function)。显然,当几率密度函数存在的时候,累积分布函数是几率密度函数的积分。io
因此,一般咱们能够经过对PDF(以下图中的左图所示为正态分布的PDF)进行积分来获得几率分布的CDF(以下图中的右图所示为正态分布的CDF)。而后咱们再获得CDF的反函数 $F^{-1}(u)$,若是你想获得 $m$ 个观察值,则重复下面的步骤 $m$ 次:
如下图为例,若是从 Uniform(0,1) 中随机生成的值 $u=0.8413$,则能够算得$F_{-1}(u)=1$,则这次从正态分布中生成的随机数就是 1。
你可能会好奇,面对一个具备复杂表达式的函数, Inverse CDF 方法真的有效吗?来看下面这个例子。假设如今咱们但愿从下面这个PDF中抽样:
$$ f(x)=\left{\begin{array}{ll}{8 x} & {, \text {if } 0 \leq x<0.25} \ {\frac{8}{3}-\frac{8}{3} x} & {, \text { if } 0.25 \leq x \leq 1} \ {0} & {, \text { otherwise }}\end{array}\right. $$
能够算得相应的CDF为
$$ F(x)=\left{\begin{array}{ll}{0} & {, \text { if } x<0} \ {4 x^{2}} & {, \text { if } 0 \leq x<0.25} \ {\frac{8}{3} x-\frac{4}{3} x^{2}-\frac{1}{3}} & {, \text { if } 0.25 \leq x \leq 1} \ {1} & {, \text { if } x>1}\end{array}\right. $$
对于 $u∈[0,1]$,它的反函数为:
$$ F^{-1}(u)=\left{\begin{array}{ll}{\frac{\sqrt{u}}{2}} & {, \text { if } 0 \leq u<0.25} \ {1-\frac{\sqrt{3(1-u)}}{2}} & {, i f 0.25 \leq u \leq 1}\end{array}\right. $$
咱们已经看到 Inverse CDF 方法确实有效。但其实它的缺点也是很明显的,那就是有些分布的 CDF 可能很难经过对 PDF 的积分获得,再或者 CDF 的反函数也很不容易求。这时咱们可能须要用到另一种采样方法,这就是咱们即将要介绍的拒绝采样。
下面这张图很好地阐释了拒绝采样的基本思想。假设咱们想对 PDF 为 $p(x)$ 的函数进行采样,可是因为种种缘由(例如这个函数很复杂),对其进行采样是相对困难的。可是另一个 PDF 为 $q(x)$ 的函数则相对容易采样,例如采用 Inverse CDF 方法能够很容易对对它进行采样,甚至 $q(x)$ 就是一个均匀分布(别忘了计算机能够直接进行采样的分布就只有均匀分布)。那么,当咱们将 $q(x)$ 与一个常数 MM 相乘以后,能够实现下图所示之关系,即$M⋅q(x)$ 将 $p(x)$ 彻底“罩住”
你固然能够采用严密的数学推导来证实Reject Sampling的可行性。但它的原理从直观上来解释也是至关容易理解的。你能够想象一下在上图的例子中,从哪些位置抽出的点会比较容易被接受。显然,红色曲线和绿色曲线所示之函数更加接近的地方接受几率较高,也便是更容易被接受,因此在这样的地方采到的点就会比较多,而在接受几率较低(即两个函数差距较大)的地方采到的点就会比较少,这也就保证了这个方法的有效性。
Reject Sampling方法确实能够解决咱们的问题。可是它的一个不足涉及到其采样效率的问题。 最理想的状况下,参考分布应该跟目标分布越接近越好,从图形上来看就是包裹的越紧实越好。可是这种状况的参考分布每每又不那么容易获得。在知足某些条件的时候也确实能够采用所谓的改进方法,即Adaptive Rejection Sampling。
前面咱们已经分析了,拒绝采样的弱点在于当被拒绝的点不少时,采样的效率会很是不理想。同时咱们也支持,若是可以找到一个跟目标分布函数很是接近的参考函数,那么就能够保证被接受的点占大多数(被拒绝的点不多)。这样一来便克服了拒绝采样效率不高的弱点。若是函数是 log-concave 的话,那么咱们就能够采样自适应的拒绝采样方法。什么是 log-concave 呢?仍是回到咱们以前介绍过的 Beta 分布的PDF,咱们用下面的代码来绘制 Beta(2, 3) 的函数图像,以及将 Beta(2, 3) 的函数取对数以后的图形
(......更详细的内容看原文)