MCMC(一)蒙特卡罗方法

    MCMC(一)蒙特卡罗方法

    MCMC(二)马尔科夫链(待填坑)

    MCMC(三)M-H采样和Gibbs采样(待填坑)

    作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多复杂算法求解的基础。比如我们前面讲到的分解机(Factorization Machines)推荐算法,还有前面讲到的受限玻尔兹曼机(RBM)原理总结,都用到了MCMC来做一些复杂运算的近似求解。下面我们就对MCMC的原理做一个总结。

1. MCMC概述

    从名字我们可以看出,MCMC由两个MC组成,即蒙特卡罗方法(Monte Carlo Simulation,简称MC)和马尔科夫链(Markov Chain ,也简称MC)。要弄懂MCMC的原理我们首先得搞清楚蒙特卡罗方法和马尔科夫链的原理。我们将用三篇来完整学习MCMC。在本篇,我们关注于蒙特卡罗方法。

2. 蒙特卡罗方法引入

    蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的方法,这很像赌博场里面的扔骰子的过程。最早的蒙特卡罗方法都是为了求解一些不太好求解的求和或者积分问题。比如积分:$$\theta = \int_a^b f(x)dx$$

    如果我们很难求解出$f(x)$的原函数,那么这个积分比较难求解。当然我们可以通过蒙特卡罗方法来模拟求解近似值。如何模拟呢?假设我们函数图像如下图:

    则一个简单的近似求解方法是在[a,b]之间随机的采样一个点。比如$x_0$,然后用$f(x_0)$代表在[a,b]区间上所有的$f(x)$的值。那么上面的定积分的近似求解为:$$(b-a)f(x_0)$$

    当然,用一个值代表[a,b]区间上所有的$f(x)$的值,这个假设太粗糙。那么我们可以采样[a,b]区间的n个值:${x_0,x_1,...x_{n-1}}$,用它们的均值来代表[a,b]区间上所有的$f(x)$的值。这样我们上面的定积分的近似求解为:$$\frac{b-a}{n}\sum\limits_{i=0}^{n-1}f(x_i)$$

    虽然上面的方法可以一定程度上求解出近似的解,但是它隐含了一个假定,即$x$在[a,b]之间是均匀分布的,而绝大部分情况,$x$在[a,b]之间不是均匀分布的。如果我们用上面的方法,则模拟求出的结果很可能和真实值相差甚远。 

    怎么解决这个问题呢? 如果我们可以得到$x$在[a,b]的概率分布函数$p(x)$,那么我们的定积分求和可以这样进行:$$\theta = \int_a^b f(x)dx =  \int_a^b \frac{f(x)}{p(x)}p(x)dx \approx \frac{1}{n}\sum\limits_{i=0}^{n-1}\frac{f(x_i)}{p(x_i)}$$

    上式最右边的这个形式就是蒙特卡罗方法的一般形式。当然这里是连续函数形式的蒙特卡罗方法,但是在离散时一样成立。

    可以看出,最上面我们假设$x$在[a,b]之间是均匀分布的时候,$p(x_i) = 1/(b-a)$,带入我们有概率分布的蒙特卡罗积分的上式,可以得到:$$\frac{1}{n}\sum\limits_{i=0}^{n-1}\frac{f(x_i)}{1/(b-a)} = \frac{b-a}{n}\sum\limits_{i=0}^{n-1}f(x_i) $$

    也就是说,我们最上面的均匀分布也可以作为一般概率分布函数$p(x)$在均匀分布时候的特例。那么我们现在的问题转到了如何求出$x$的分布$p(x)$的若干和样本上来。

3. 概率分布采样

    上一节我们讲到蒙特卡罗方法的关键是得到$x$的概率分布。如果求出了$x$的概率分布,我们可以基于概率分布去采样基于这个概率分布的n个$x$的样本集,带入蒙特卡罗求和的式子即可求解。但是还有一个关键的问题需要解决,即如何基于概率分布去采样基于这个概率分布的n个$x$的样本集。 

    对于常见的均匀分布$uniform(0,1)$是非常容易采样样本的,一般通过线性同余发生器可以很方便的生成(0,1)之间的伪随机数样本。而其他常见的概率分布,无论是离散的分布还是连续的分布,它们的样本都可以通过$uniform(0,1)$的样本转换而得。比如二维正态分布的样本$(Z_1,Z_2)$可以通过通过独立采样得到的$uniform(0,1)$样本对$(X_1,X_2)$通过如下的式子转换而得:$$Z_1 = \sqrt{-2 ln X_1}cos(2\pi X_2)$$$$Z_2 = \sqrt{-2 ln X_1}sin(2\pi X_2)$$

    其他一些常见的连续分布,比如t分布,F分布,Beta分布,Gamma分布等,都可以通过类似的方式从$uniform(0,1)$得到的采样样本转化得到。在python的numpy,scikit-learn等类库中,都有生成这些常用分布样本的函数可以使用。

    不过很多时候,我们的$x$的概率分布不是常见的分布,这意味着我们没法方便的得到这些非常见的概率分布的样本集。那这个问题怎么解决呢?

4. 接受-拒绝采样

    对于概率分布不是常见的分布,一个可行的办法是采用接受-拒绝采样来得到该分布的样本。既然 $p(x)$ 太复杂在程序中没法直接采样,那么我设定一个程序可采样的分布 $q(x)$ 比如高斯分布,然后按照一定的方法拒绝某些样本,以达到接近 $p(x)$ 分布的目的,其中$q(x)$叫做 proposal distribution。

    具体采用过程如下,设定一个方便采样的常用概率分布函数 $q(x)$,以及一个常量 $k$,使得 $p(x)$ 总在 $kq(x)$ 的下方。如上图。

    首先,采样得到$q(x)$的一个样本$z_0$,采样方法如第三节。然后,从均匀分布$(0, kq(z_0)) $中采样得到一个值$u$。如果$u$落在了上图中的灰色区域,则拒绝这次抽样,否则接受这个样本$z_0$。重复以上过程得到n个接受的样本$z_0,z_1,...z_{n-1}$,则最后的蒙特卡罗方法求解结果为:$$\frac{1}{n}\sum\limits_{i=0}^{n-1}\frac{f(z_i)}{p(z_i)}$$

    整个过程中,我们通过一系列的接受拒绝决策来达到用$q(x)$模拟$p(x)$概率分布的目的。

5. 蒙特卡罗方法小结

    使用接受-拒绝采样,我们可以解决一些概率分布不是常见的分布的时候,得到其采样集并用蒙特卡罗方法求和的目的。但是接受-拒绝采样也只能部分满足我们的需求,在很多时候我们还是很难得到我们的概率分布的样本集。比如:

    1)对于一些二维分布$p(x,y)$,有时候我们只能得到条件分布$p(x|y)$和$p(y|x)$和,却很难得到二维分布$p(x,y)$一般形式,这时我们无法用接受-拒绝采样得到其样本集。

    2)对于一些高维的复杂非常见分布$p(x_1,x_2,...,x_n)$,我们要找到一个合适的$q(x)$和$k$非常困难。

    从上面可以看出,要想将蒙特卡罗方法作为一个通用的采样模拟求和的方法,必须解决如何方便得到各种复杂概率分布的对应的采样样本集的问题。而我们下一篇要讲到的马尔科夫链就是帮助找到这些复杂概率分布的对应的采样样本集的白衣骑士。下一篇我们来总结马尔科夫链的原理。

(欢迎转载,转载请注明出处。欢迎沟通交流: [email protected])

时间: 2024-12-17 12:40:08

MCMC(一)蒙特卡罗方法的相关文章

误码率仿真,蒙特卡罗方法,置信度

本文将介绍利用蒙特卡罗方法对误码率进行仿真的基本原理和基本原则. 1. 简介     误码率是通信系统性能评价的一个重要指标,在给定信道.编译码方式下,误码率是一个固定取值.少部分情况下,可以通过理论推导得到理论的误码率,但是在大多数情况下,理论误码率无法推得,这时往往考虑采用蒙特卡罗方法对误码率进行仿真.(误比特率.误码率同理)     蒙特卡罗方法是一种通过随机采样获得数值解的一类计算方法.误码率,即给定条件下传输的错误概率,可以近似计算为错误码数和总码数之间的比值,因此很容易通过蒙特卡罗方

(转)阮一峰-蒙特卡罗方法入门

本文转载自阮一峰-蒙特卡罗方法入门 本文通过五个例子,介绍蒙特卡罗方法(Monte Carlo Method). 一.概述 蒙特卡罗方法是一种计算方法.原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值. 它非常强大和灵活,又相当简单易懂,很容易实现.对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法. 它诞生于上个世纪40年代美国的"曼哈顿计划",名字来源于赌城蒙特卡罗,象征概率. 二.π的计算 第一个例子是,如何用蒙特卡罗方法计算圆周率π. 正方形内部有

用蒙特卡罗方法计算五人传球问题

蒙特卡罗方法百度解释http://baike.baidu.com/link?url=XwVnK6P_gip61_P9RzC9u6T4KQP5hmoZIvx57XBM66hPBONRRl3-yAwldGr3orFe 问题描述: 有A B C D E 五个人,围成一圈,开始球在A的手上,然后由A向与自己相邻的两边的某一人传球,然后要求计算球被传十次,最后又回到A手中的概率. 如上图所示,A只能把球传给B或者E,其几率是相同的. 对每个人来说把球传给左边或者右边的人的几率都是相同的,且为1/2: 这样

蒙特卡罗方法python简单实现

蒙特卡罗方法是一种计算方法.原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值. 1.估算pi值 import random n = 10000 k = 0 for i in range(n): x = random.uniform(-1,1) y = random.uniform(-1,1) if x**2 + y**2 <1: k +=1 print(4*float(k)/float(n)) 2.计算y=x^2在[0,1]的积分 import random n = 1000 k =

蒙特卡罗方法入门

蒙特卡罗方法入门 原文出处: 阮一峰的日志(@ruanyf)   欢迎分享原创到伯乐头条 本文通过五个例子,介绍蒙特卡罗方法(Monte Carlo Method). 一.概述 蒙特卡罗方法是一种计算方法.原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值. 它非常强大和灵活,又相当简单易懂,很容易实现.对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法. 它诞生于上个世纪40年代美国的”曼哈顿计划”,名字来源于赌城蒙特卡罗,象征概率. 二.π的计算 第一个例子是,如

蒙特卡罗方法计算圆周率

蒙特卡罗方法计算圆周率 前几天读到了一篇网志:蒙特卡罗方法入门,http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html 其中介绍了用概率计算圆周率的方法,所以就用程序做了以下尝试. 作为常量的PI值的近似在Math.PI中为3.141592653589793. Ⅰ.方形中的所有像素计算 package yumu.probability.montecarlo; public class CalculatePI { private

[数学建模]蒙特卡罗方法

1.概念 蒙特卡罗方法(随机取样法)是一种计算方法.原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值. 2.两个应用例子 例子1:求π的值. 正方形内部有一个相切的圆,它们的面积之比是π/4.现在,在这个正方形内部,随机产生1000000个点(即1000000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部.如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值. MATLAB实现: N=1000000;    %随机点的

蒙特卡罗方法(Monte Carlo method)

蒙特卡罗方法(Monte Carlo method) 蒙特卡罗方法概述   蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解.为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名. 蒙特卡罗方法的提出   蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的"曼哈顿计划&qu

MATLAB实现蒙特卡罗方法

1.首先编写M文件mengte.m定义目标函数f和约束向量g %%%蒙特卡洛法 %%定义目标函数和约束向量函数 function [f, g] = mengte(x); f = x(1) ^ 2 + x(2) ^ 2 + 3 * x(3) ^ 2 + 4 * x(4) ^ 2 + 2 * x(5) - 8 * x(1) - 2 * x(2) - 3 * x(3) - x(4) - 2 * x(5); g = [sum(x) - 400 x(1) + 2 * x(2) + 2 * x(3) + x