您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

蒙特卡罗方法概述

时间:2020-03-15 13:27:12  来源:  作者:

作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多复杂算法求解的基础。

从名字我们可以看出,MCMC由两个MC组成,即蒙特卡罗方法(Monte Carlo Simulation,简称MC)和马尔科夫链(Markov Chain ,也简称MC)。要弄懂MCMC的原理我们首先得搞清楚蒙特卡罗方法和马尔科夫链的原理。

蒙特卡罗方法

蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的方法,这很像赌博场里面的扔骰子的过程。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。

它非常强大和灵活,又相当简单易懂,很容易实现。对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法。

给定统计样本集,如何估计产生这个样本集的随机变量概率密度函数,是我们比较熟悉的概率密度估计问题。

求解概率密度估计问题的常用方法是最大似然估计、最大后验估计等。但是,我们思考概率密度估计问题的逆问题:给定一个概率分布p(x),如何让计算机生成满足这个概率分布的样本。

这个问题就是统计模拟中研究的重要问题–采样(Sampling)。

如果有一个我们很难求解出f(x)f(x)的原函数的函数, 现要求其在定义域 [a, b] 上的积分, 如果这个函数是均匀分布, 那么我们可以采样 [a,b] 区间的 n 个值:${x 0,x_1,…x {n-1}}$,用它们的均值来代表 [a,b] 区间上所有的 f(x) 的值。这样我们上面的定积分的近似求解为:

如果不是均匀分布, 并 假设我们可以得到 xx 在[a,b][a,b]的概率分布函数p(x)p(x) ,那么我们的定积分求和可以这样进行:

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

可以看出,最上面我们假设x在[a,b]之间是均匀分布的时候,p(xi)=1/(b−a),带入我们有概率分布的蒙特卡罗积分的上式,可以得到:

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

采样方法

主要有概率分布采样及接受-拒绝采样方法.

概率分布采样

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

一般而言均匀分布 Uniform(0,1) 的样本是相对容易生成的。 通过线性同余发生器可以生成伪随机数,我们用确定性算法生成[0,1]之间的伪随机数序列后,

这些序列的各种统计指标和均匀分布 Uniform(0,1) 的理论计算结果非常接近。这样的伪随机序列就有比较好的统计性质,可以被当成真实的随机数使用。线性同余随机数生成器如下:

式中a,c,ma,c,m是数学推导出的合适的常数。这种算法产生的下一个随机数完全依赖当前的随机数,当随机数序列足够大的时候,随机数会出现重复子序列的情况。

当然,也有很多更加先进的随机数产生算法出现,比如 numpy 用的是 Mersenne Twister 等.

而其他常见的概率分布,无论是离散的分布还是连续的分布,它们的样本都可以通过 Uniform(0,1) 的样本转换而得, 但是如何产生满足其他分布下的随机数呢?

比如二维正态分布的样本(Z1,Z2)(Z1,Z2)可以通过通过独立采样得到的 uniform(0,1) 样本对(X1,X2)(X1,X2)通过如下的式子转换而得:

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

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

接受-拒绝采样

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

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

蒙特卡罗方法概述

 

首先,采样得到 q(x) 的一个样本$z 0$,采样方法如上,使用 uniform(0,1) 转换得到。然后,从均匀分布(0,kq(z0))(0,kq(z0))中采样得到一个值uu。如果uu落在了上图中的灰色区域,则拒绝这次抽样,否则接受这个样本z0z0。重复以上过程得到 n 个接受的样本 $z_0,z_1,…z {n−1}$,则最后的蒙特卡罗方法求解结果为:

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

小结

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

  1. 对于一些二维分布p(x,y)p(x,y),有时候我们只能得到条件分布p(x|y)p(x|y)和p(y|x)p(y|x),却很难得到二维分布p(x,y)p(x,y)一般形式,这时我们无法用接受-拒绝采样得到其样本集。
  2. 对于一些高维的复杂非常见分布p(x1,x2,…,xn)p(x1,x2,…,xn),我们要找到一个合适的q(x)和q(x)和k$非常困难。

从上面可以看出,要想将蒙特卡罗方法作为一个通用的采样模拟求和的方法,必须解决如何方便得到各种复杂概率分布的对应的采样样本集的问题。

此时就需要使用一些更加复杂的随机模拟的方法来生成样本。比如马尔科夫链蒙特卡罗方法,了解这个算法我们首先要对马尔科夫链的平稳分布的性质有基本的认识。



Tags:蒙特卡罗   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
> Figure 1: The Monte Carlo Simulation method is used in many industries, from the stock market to finance, energy, banking, and other forecasting models. | So...【详细内容】
2020-11-10  Tags: 蒙特卡罗  点击:(52)  评论:(0)  加入收藏
作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多复杂算法求解的基础。从名...【详细内容】
2020-03-15  Tags: 蒙特卡罗  点击:(53)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条