「埃尔法哥哥」蒙特卡罗方法概述

作为一种随机采样方法 , 马尔科夫链蒙特卡罗(MarkovChainMonteCarlo , 以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用 , 是很多复杂算法求解的基础 。
从名字我们可以看出 , MCMC由两个MC组成 , 即蒙特卡罗方法(MonteCarloSimulation , 简称MC)和马尔科夫链(MarkovChain , 也简称MC) 。 要弄懂MCMC的原理我们首先得搞清楚蒙特卡罗方法和马尔科夫链的原理 。
蒙特卡罗方法
蒙特卡罗原来是一个赌场的名称 , 用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的方法 , 这很像赌博场里面的扔骰子的过程 。 原理是通过大量随机样本 , 去了解一个系统 , 进而得到所要计算的值 。
它非常强大和灵活 , 又相当简单易懂 , 很容易实现 。 对于许多问题来说 , 它往往是最简单的计算方法 , 有时甚至是唯一可行的方法 。
给定统计样本集 , 如何估计产生这个样本集的随机变量概率密度函数,是我们比较熟悉的概率密度估计问题 。
求解概率密度估计问题的常用方法是最大似然估计、最大后验估计等 。 但是 , 我们思考概率密度估计问题的逆问题:给定一个概率分布p(x) , 如何让计算机生成满足这个概率分布的样本 。
【「埃尔法哥哥」蒙特卡罗方法概述】这个问题就是统计模拟中研究的重要问题–采样(Sampling) 。
如果有一个我们很难求解出f(x)f(x)的原函数的函数,现要求其在定义域[a,b]上的积分,如果这个函数是均匀分布,那么我们可以采样[a,b]区间的n个值:${x0,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用的是MersenneTwister等.
而其他常见的概率分布 , 无论是离散的分布还是连续的分布 , 它们的样本都可以通过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等类库中 , 都有生成这些常用分布样本的函数可以使用 。