开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2021.04.26
马尔可夫链蒙特卡洛方法(MarkovChainMonteCarlo),简称MCMC。其产生于20世纪50年代早期,是在贝叶斯理论框架下,通过计算机进行模拟的蒙特卡洛方法(MonteCarlo)。该方法将马尔可夫(Markov)过程引入到MonteCarlo模拟中,实现抽样分布随模拟的进行而改变的动态模拟,弥补了传统的蒙特卡罗积分只能静态模拟的缺陷。
Metropolis等人在1953年首次提出了基于马尔可夫链的蒙特卡罗方法,即Metropolis算法,并在最早的计算机上编程实现。Metropolis算法是首个普适的采样方法,并启发了一系列MCMC方法,所以人们把它视为随机模拟技术腾飞的起点。Metropolis算法这篇论文[1]被收录在《统计学中的重大突破》中,《ComputinginScience&Engineering》尝试列出了对20世纪科学与工程的发展和实践影响最大的十种算法:
MetropolisAlgorithmforMonteCarlo被列为十大算法之首。用于蒙特卡洛的Metropolis算法定义了一个收敛的马尔可夫链,其极限就是所需的概率分布。Metropolis算法及其推广算法已被称为蒙特卡洛马尔可夫链技术(MCMC),因为这些算法模拟了一个马尔可夫链,从极限分布中获取抽样。
搞自然科学研究的人,MCMC应该是基本装备。所谓平生不识MCMC,便称英雄也枉然。
MCMC由两个MC组成,即马尔可夫链(MarkovChain,也简称MC)和蒙特卡洛法(MonteCarloSimulation,简称MC)。要弄懂MCMC的原理我们首先得搞清楚马尔科夫链的原理和蒙特卡罗法。
马尔可夫链的命名来自俄国数学家安德雷.马尔可夫以纪念其首次提出马尔可夫链和对其收敛性质所做的研究。
马尔可夫链是一组具有马尔可夫性质的离散随机变量的集合。所谓马尔可夫性质是指某一时刻状态转移的概率只依赖于它的前一个状态。
具体地,马氏链的数学定义:
对概率空间内的离散随机变量集合
若随机变量的取值都在可数集S内:
且随机变量的条件概率满足如下关系
则随机变量集合X被称为马尔可夫链,可数集S被称为状态空间,马尔可夫链在状态空间内的取值称为状态。
马尔可夫过程通常分为3类:
我们先来看马氏链的一个具体的例子。社会学家经常把人按其经济状况分成3类:下层(lower-class)、中层(middle-class)、上层(upper-class),我们用1、2、3分别代表这三个阶层。社会学家们发现决定一个人的收入阶层的最重要的因素就是其父母的收入阶层。如果一个人的收入属于下层类别,那么他的孩子属于下层收入的概率是0.65,属于中层收入的概率是0.28,属于上层收入的概率是0.07。事实上,从父代到子代,收入阶层的变化的转移概率如图2-1和图2-2
图2-1
图2-2
设状态空间S={1,2,3}(1、2、3分别代表人的收入阶层:下层、中层、上层),使用矩阵的表示方式,转移概率矩阵记为:
假设当前这一代人处在下层、中层、上层的人的比例是概率分布向量:
那么他们的子女的分布比例将是
他们的孙子代的分布比例将是
第n代子孙的收入分布比例将是
假设初始概率分布为π0=[0.21,0.68,0.11],则我们可以计算前n代人的分布状况如下
我们发现从第7代人开始,这个分布就稳定不变了,这个是偶然的吗?我们换一个初始概率分布π0=[0.75,0.15,0.1]试试看,继续计算前n代人的分布状况如下:
我们发现,到第9代人的时候,分布又收敛了。最为奇特的是,两次给定不同的初始概率分布,最终都收敛到概率分布π=[0.286,0.489,0.225],也就是说收敛的行为和初始概率分布π0无关。这说明这个收敛行为主要是由概率转移矩阵P决定的。我们计算一下P的n阶矩阵为
我们发现,当n足够大的时候,这个P的n阶矩阵的每一行都是稳定地收敛到π=[0.286,0.489,0.225]这个概率分布。这个收敛现象并非是我们这个马氏链独有的,而是绝大多数马氏链的共同行为。这个性质同样不光是离散状态,连续状态时也成立。
马氏链定理:如果一个非周期马氏链具有转移概率矩阵P,状态空间S,i,j∈S且它的任何两个状态是连通的,那么
这就是马氏链的收敛定理。
由该定理可以得出如下结论:
<1>
<2>
<3>π是方程πP=π的唯一非负解。其中,
π称为马氏链的平稳分布。
请注意两种表示方式的不同:
这个马氏链的收敛定理非常重要,所有的MCMC方法都是以这个定理作为理论基础的。定理的证明相对复杂,一般的随机过程课本中也不给证明,所以我们就不用纠结它的证明了,直接用这个定理的结论就好了。我们对这个定理的内容做一些解释说明:
我们仅证明定理的第二个结论
证明:
上式两边取极限就得到
证明完毕。
给定一个马尔可夫链,若在其状态空间S存在概率分布
则π是该马尔可夫链的平稳分布。
细致平衡条件(DetailedBalanceCondition):给定一个马尔科夫链,概率分布π和概率转移矩阵P,i,j∈S,(S是状态空间),如果下面等式成立:
则此马尔科夫链具有一个平稳分布(StationaryDistribution)。
需要注意,这个细致平衡条件仅是一个充分条件,而不是必要条件,也就是说存在具有平稳分布的马尔科夫链不一定满足此细致平衡条件。
证明如下:
由条件推出
得
所以此马尔科夫链具有一个平稳分布。
从初始概率分布π0(x)出发,我们在马氏链上做状态转移,记Xi的概率分布为πi(x),则有
由马氏链收敛的定理,概率分布πi(x)将收敛到平稳分布π(x)。假设到第n步的时候马氏链收敛,则有
所以
也就是说无论我们的起始状态是何种概率分布,在状态转移矩阵P的作用下,经过足够大的n步转移之后,最后都收敛到一个平稳分布,且该分布是唯一不变的。即平稳分布仅由状态转移矩阵P决定。
设马尔可夫链的状态空间S={ω1,ω2,...,ωi,...ωn}(可以理解为样本空间在随机过程中的表达),如果我们从一个具体的初始状态x0∈S(x0可能是ω2,也可能是ωi)开始,沿着马氏链按照概率转移矩阵做跳转,那么我们可以得到一个转移状态序列,马氏链终于露出了它的庐山真面:
尽管马尔可夫链最终会收敛到所需的分布,但是初始样本可能会遵循非常不同的分布,尤其是在起点位于低密度区域的情况下。结果,通常需要一个老化期,所以我们会舍弃前面的老化样本,得到我们需要的平稳样本集
这就是平稳分布π的状态样本序列。最后平稳分布的样本集可能达到几万、几十万甚至更大的规模。统计各个状态出现的频次,归一化后画出统计直方图,就可以模拟目标分布。
1>输入马尔可夫链状态转移矩阵P,状态空间S,设定状态转移收敛次数为n1,迭代次数为n2;
2>从任意简单概率分布采样得到初始状态值x0∈S;
3>fort=0ton1+n2-1:从条件概率分布p(x|x(t))中采样,得到样本x=x(t+1).去掉前面的老化样本,最终的样本集
即为我们需要的平稳分布对应的样本集。
这里大家会问:
简单概率分布可选择正态分布或均值分布,正态分布根据Box–Muller变换法或接受-拒绝采样法采样,均值分布可直接计算机采样;条件概率分布可由输入转移矩阵P得到概率数据,然后根据离散随机变量逆变换法采样。这些采样方法后面有详细介绍。
两种采样方法来理解:
第1种方法,从简单概率分布中采样10000个的初始状态样本,用最简单粗暴的方法对每一个初始样本都执行一次n(n>n1)步转移,状态之间的转移概率从该马尔科夫链的状态转移矩阵获取,最后依如下概率落入状态空间中的一个状态。
当初始状态样本足够多时,由大数定律,最终落入到平稳马氏链的各个状态的数量所占的比例逼近各个状态的平稳分布概率。但是这样一来计算量相当大,每次只利用了采样过程中的最后一个状态,且要运行10000次进入平稳状态的转移过程,数据的利用率很低,浪费也很大。
第2种方法,只需要对一个初始状态进行状态转移,就可以实现整个采样过程。我们把它进入稳态的那一刻记作t0,当t0时刻的状态向下一个时刻t1转移时,它依照稳态分布概率
(由n-步转移概率的性质Chapman–Kolmogorov等式可知,n-步转移矩阵是其之前所有转移矩阵的连续矩阵乘法,证明见附录1)
图2-3示意了进入平稳期的采样全过程(假设总共3个状态):
图2-3
马尔可夫链的4个性质:不可约性、常返性、周期性和遍历性。
马尔可夫链在处理随机动力学时对问题建模的强大作用。
马尔可夫链预测理论在教育学、经济学、金融投资、生物学、农作物栽培、地质灾变,...特别是水资源科学中都得到了极为广泛地应用。
例如,马尔可夫链在排队理论、统计数据、生物种群进化建模、隐马尔可夫模型信息理论、语音识别、音字转换、词性标注、蒙特卡洛采样等都有应用。
蒙特卡洛(MonteCarlo,MC)方法,又称随机抽样法,统计试验法或随机模拟法。
蒙特卡罗法是由冯·诺伊曼等人在20世纪40年代为研制核武器的需要而首先提出并以摩纳哥的赌城MonteCarlo来命名的一种计算方法。
蒙特卡洛法是数学建模十大算法之一,是思想和技巧的艺术品。它的魔力在于,对于那些规模极大的问题,求解难度随着问题的维数(自变量个数)的增加呈指数级别增长、出现所谓的“维数的灾难”的问题,传统方法无能为力,而蒙特卡洛方法却可以独辟蹊径,基于随机仿真的过程给出近似的结果。
蒙特卡洛法是一类通过随机抽样过程来求取最优解的方法的总称,如果建立蒙特卡洛模型的过程没有出错,那么抽样次数越多,得到的答案越精确。蒙特卡洛法可以归纳为如下三个步骤:
对于本身就具有随机性质的问题,主要是正确描述和模拟这个概率过程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为随机性质的问题。
实现从已知概率分布抽样。
构造了概率模型以后,按照这个概率分布抽取随机变量。这一般可以直接由软件工具包(见附录2,3,4)调用,或抽取均匀分布的随机数构造。这成为实现蒙特卡洛方法模拟实验的基本手段,也是蒙特卡洛方法被称为随机抽样的原因。
一般说来,构造了概率模型并能从中抽样后(即实现模拟实验后),我们就要确定一个随机变量,作为所要求的问题的解,我们称它为无偏估计。建立各种估计量,相当于对模拟实验的结果进行考察和登记,从中得到问题的解。
蒙特卡洛方法应用非常广泛,其领域包括统计物理、天体物理、物理化学、数学、计算生物、统计学、经济学、金融证券、社会科学等等。
蒙特卡洛方法在解决物理和数学问题时时常被使用。当十分困难或不可能得到解析表达式,或不可能应用确定性算法时,该方法显得尤其重要和最为有用。
蒙特卡洛方法主要用于两个不同类别的问题:
无理数、不规则图形的面积、多重积分、求逆矩阵、解线性代数方程组、解积分方程、解某些偏微分方程边值问题和计算代数方程组、计算微分算子的特征值等等。
仿真、概率分布的生成(MCMC算法)。
解题思路:
构造一个单位正方形和一个单位圆的1/4,往整个区域内随机投入点,根据点到原点的距离判断点是落在1/4的圆内还是在圆外,从而根据落在两个不同区域的点的数目,求出两个区域的比值。如此一来,就可以求出1/4单位圆的面积,从而求出圆周率π。
解题步骤:
第1步,建模,构造概率过程,选择区域内随机投入点作为随机变量;
第2步,选择二维均匀分布Y=sqrt(h^2+v^2),h、v~U[0,1],作为已知概率分布抽样;
第3步,根据落入正方形样本数和1/4圆样本数,求出结果。
演示代码:
例子1
解题思路如下:
假定随机变量具有密度函数
根据数学期望公式得
构造统计数
根据大数定律
最终求出了定积分。
例子2求定积分
将原式变形为
解:采用蒙特卡洛方法,MATLAB模拟,
N=500;
x=unifrnd(0,2,N,1);
mean(2*exp(3*x.^2))
第一条语句设定了停止条件,共做N次MonteCarlo模拟;
第二条语句实现了在积分区间[0,2]均匀产生N个随机数;
第三条语句求样本均值,实现蒙特卡洛计算方法的面积逼近。
图4-1是一个中子穿过用于中子屏蔽的铅墙示意图。铅墙的高度远大于左右厚度。设中子是垂直由左端进入铅墙,在铅墙中运行一个单位距离然后与一个铅原子碰撞。碰撞后,任意改变方向,并继续运行一个单位后与另一个铅原子碰撞。这样下去,如果中子在铅墙里消耗掉所有的能量或者从左端逸出就被视为中子被铅墙挡住,如果中子穿过铅墙由右端逸出就视为中子逸出。如果铅墙厚度为5个单位,中子运行7个单位后能量耗尽,求中子逸出的几率。
这个问题并不复杂,但不容易找到一个解析表达式。而用模拟仿真的方法求解却可以有满意的结果。解题步骤如下:
第1步,建模,构造概率过程,选择中子碰撞后的角度作为随机变量;
第2步,选择角度的均匀分布作为已知概率分布抽样;
第3步,根据假设的总中子样本数和逸出的中子样本数,求出结果。
解:具体做法如下:
我们关心的是一次碰撞后,中子在水平方向行进了多少,所以行进方向是正负θ的结果是一样的,我们就只考虑θ是正的情形。由于中子运行的方向θ是随机的,我们用计算机抽取在0到π间均衡分布的随机数,模拟1000000个中子在铅墙里行进的情形,看看这些中子与铅原子碰撞7次后,有多少超过了铅墙的右端。
实现伪代码
n=1000000;m=0;flag=1;fori=1:nx=1;forj=1:7angle=pi*rand;x=x+cos(angle);ifx<0k=0;flag=0;endendifx>5&flag==1k=1;elsek=0;endm=m+k;flag=1;end运行结果:m/n=1.3%
我们运行程序得出逸出铅墙的中子的可能性约为1.3%,有了这个数字,我们可以报告安全部门,如果数字不能达到安全要求,我们则要加厚铅墙。
对于给定的概率分布p(x),我们希望能有便捷的方式生成它对应的样本。由于马氏链能收敛到平稳分布,于是一个很的漂亮想法是:如果我们能构造一个转移矩阵为P的马氏链,使得该马氏链的平稳分布恰好是p(x),那么我们从任何一个初始状态x0出发沿着马氏链转移,得到一个转移状态序列
如果马氏链在第n步已经收敛了,于是我们就得到了平稳分布p(x)的样本集
这个绝妙的想法在1953年被Metropolis等人想到了,为了研究粒子系统的平稳性质,Metropolis考虑了物理学中常见的波尔兹曼分布的采样问题,首次提出了基于马氏链的蒙特卡罗方法,即Metropolis算法,并在最早的计算机上编程实现。
从贝叶斯(Bayesian)的观点来看,模型中的观测变量和参数都是随机变量,因此,样本x与参数θ的联合分布可以表示为:
根据贝叶斯理论,可以通过样本x的信息对θ的分布的进行更新,后验概率为:
其中π(θ)先验概率;f(x|θ)似然函数(即样本的概率分布);分母是标准化常量。后验概率=(似然函数*先验概率)/标准化常量=标准似然度*先验概率。
贝叶斯学习中经常需要进行三种积分运算:
1>后验概率计算中需要归范化计算:
2>如果有隐变量z∈Z,后验概率的计算需要边缘化计算:
3>如果有一个函数g(θ),可以计算该函数的关于后验概率分布的数学期望:
此积分值为样本x的函数,因此可以对g(θ)进行推断。
该期望估计
当维数很高时,直接进行这三类积分是非常困难的,MCMC方法就是为此目的而诞生,为这些计算提供了一个通用的有效解决方案。
对很多贝叶斯推断问题来说,有时候后验分布过于复杂,使得积分没有显示结果,数值方法也很难应用;有时候需要计算多重积分(比如后验分布是多元分布时)。这些都会带来计算上的很大困难。这也是在很长的时期内,贝叶斯统计得不到快速发展的一个原因。1990年代MCMC计算方法引入到贝叶斯统计学之后,一举解决了这个计算的难题。MCMC方法的最新发展使计算大型分层模型成为可能,这些模型需要对数百到数千个未知参数进行积分。可以说,近年来贝叶斯统计的蓬勃发展,特别是在各个学科的广泛应用和MCMC方法的使用有着极其密切的关系。
MCMC算法是一个普适的采样方法,它的出现带来了随机模拟技术的腾飞。在随机变量生成技术中,MCMC是一种相当高级的方法,可以从一个非常困难的概率分布中获得样本。更出乎意料的是,可以用MCMC从一个未经标准化的分布中获得样本,这来自于定义马尔可夫链的特定方式,马尔可夫链对这些归一化因子并不敏感。
对高维(多个自变量)积分的数值近似计算是MCMC方法的一种重要的应用,很多统计问题,比如计算概率、矩(期望、方差等)都可以归结为定积分的计算。
MCMC的精髓在于构造合适的马氏链。
MCMC是一种简单有效的计算方法,在很多领域到广泛的应用,如统计学、贝叶斯(Bayes)问题、计算机问题等。
MCMC背后的基本思想是构造一个遍历的马尔可夫链,使得其平稳的、收敛的极限分布成为人们所需要的目标概率分布。
设马尔可夫链的状态空间S={ω1,ω2,...ωn}(可以理解为样本空间在随机过程中的表达),从某个初始状态x0出发,用构造的马尔可夫链随机游走,产生状态样本序列:
舍弃前面的老化(不稳定)的样本集合
应用遍历定理,确定正整数m和n,得到平稳分布的状态样本集合:
该样本集可能达到几万、几十万、几千万甚至更大的规模。统计该状态样本集中对应的各个状态ω1,ω2...出现的频次,归一化后画成直方图。如图3-1所示,绿色部分就是状态概率分布(即抽样概率分布),红色部分是目标概率分布。t趋近∞时,抽样概率分布可以无限逼近目标概率分布。如图4-1所示。
图4-1
平时我们接触比较多的场景是,给定一堆样本数据,求出这堆样本的概率分布p(x)。而采样刚好是个逆命题:给定一个概率分布p(x),如何生成满足条件的样本?
通过样本可以计算各类统计量(如均值、方差、矩等),而此类统计量就是欲求问题的近似解。例如求积分,根据大数定律,相当于求某概率分布采样样本的均值。
蒙特卡罗模拟有一个危险的缺陷:如果必须输入一个模式中的随机数并不像设想的那样是随机数,而却构成一些微妙的非随机模式,那么整个的模拟和预测结果都可能是错的。
对于给定的概率分布来说,采样必须是随机的,这个非常重要。随机采样对于人来说,是不能也,非不为也。依靠人来采样很难得到真正的随机样本,人为地通过概率分布函数计算得到一批样本注定是徒劳的。
真随机数生成器(TrueRandomNumberGenerator,TRNG)是一种通过物理过程而不是计算机程序来生成随机数字的设备。通常是基于一些能生成随机的“噪声”信号的微观现象,如热力学噪声、光电效应和量子现象等,其物理过程在理论上是完全不可预测的,并且这种不可预测性要经过实验检验。真随机数生成器通常由换能器、放大器和模拟数字转换器组成。其中换能器用来将物理过程中的某些效果转换为电信号,放大器及其电路用来将随机扰动的振幅放大到宏观级别,而模拟数字转换器则用来将输出变成数字,通常是二进制的零和一。通过重复采样这些随机的信号,一系列的随机数得以生成。
硬件随机数发生器通常每秒仅产生有限数量的随机位。为了增加可用的输出数据速率,通常将它们用于生成“种子”,以用于更快的密码安全伪随机数生成器,然后生成器以更高的数据速率生成伪随机输出序列。
伪随机数发生器是依靠计算机按照一定算法模拟产生的,其结果是确定的,是可见的。通过这种方式产生的“随机数”并不随机,是伪随机数。贝尔实验室的里德博士告诫人们记住伟大的诺依曼的忠告:“任何人如果相信计算机能够产生出真正的随机的数序组都是疯子。”
伪随机数存在两大问题
真随机数的生成对技术的要求比较高,在实际应用中往往使用伪随机数就够了。在使用伪随机数时,要尽量克服其存在的两大问题。对于第一个问题,不能从本质上加以改变,但只要递推公式选的比较好,随机数间的相互独立性是可以近似满足的;对于第二个问题,因为用蒙特卡罗方法解任何具体问题时,所使用的随机数的个数总是有限的,只要所用随机数的个数不超过伪随机数序列出现循环现象时的长度就可以了。
我们通过采样获取足够多的样本,然后统计样本空间中的样本出现的频次,来模拟和逼近目标概率分布的。采样样本越多,越逼近目标概率分布。如图5-1所示。
几万或几十万的样本集是小目标;几百万或几千万的样本集很常见;在AI和大数据时代,目标概率分布有时会涉及到几百个、几千个参数,几百亿的样本集都出现了。
图5-1
这与算法和采样策略有关。
这与算法有关,要从理论上证明。
例如:线性同余伪随机数生成器
X是伪随机序列;
m,m>0表示模量;