作为一种随机采样方法,马尔科夫链蒙特卡罗(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) 的下方 。
推荐阅读
- 分布式系统ID的生成方法之UUID、数据库、算法、Redis、Leaf方案
- 北港毛尖的冲泡方法,北港毛尖茶的储藏方法
- 霍山黄芽冲泡方法介绍,霍山黄芽礼盒价格详情
- 霍山黄芽泡茶的方法,霍山黄芽如何辨别
- 小孩出虚汗的食疗方法有哪些
- 黄芽茶汤色滋味,霍山黄芽泡茶的方法
- 如何讲解玻璃杯冲泡黄茶的茶艺表演,看看君山银针的鉴别方法
- 皖西黄大茶冲泡方法,皖西黄大茶茶叶品鉴茶汤黄中带褐色
- 黄小茶用什么器具冲泡,教你正确的冲泡方法
- 血散薯养殖方法介绍