转载随笔,原贴地址:MCMC和Gibbs Sampling算法

本文是整理网上的几篇博客和论文所得出来的,所有的原文连接都在文末。

在科学研究中,如何生成服从某个概率分布的样本是一个重要的问题。如果样本维度很低,只有一两维,我们可以用反切法,拒绝采样和重要性采样等方法。但是对于高位样本,这些方法就不适用了。这时我们就可以使用一些“高档”的算法,比如Metropolis-Hasting算法和Gibbs Sampling算法。

Metropolis-Hasting算法和Gibbs Sampling算法是马尔科夫链蒙特卡洛(Markov Chain Mento Carlo,MCMC)方法。

1. 马尔科夫链蒙特卡洛(MCMC)方法

MCMC方法是用蒙特卡洛方法去体现马尔科夫链的方法。在讲MCMC之前,必须要先讲一下马尔科夫链,马尔链的数学定义为:

 
 

也就是说当前状态只和前一个状态有关,而与其他状态无关,Markov Chain 体现的是状态空间的转换关系,下一个状态只和当前状态有关。比如下图就是一个马尔科夫链的示意图:

 
 

图中转换关系可以用一个概率转换矩阵 p 表示,如下:

 
 

在上图中,我们假设当前状态为 u = [0.5, 0.2, 0.3],那么下一个矩阵的状态就是 u*p = [0.18, 0.64, 0.18],再下一个矩阵的状态就是 u*p*p = [ 0.108, 0.316, 0.576],依照这个转换矩阵一直转换下去,最后的系统就趋近于一个稳定状态 [0.22, 0.41, 0.37]。而事实证明无论你从哪个点出发,经过很长的 Markov Chain 之后都会稳定到这一点。

>>> u
array([ 0.5, 0.2, 0.3])
>>> p
array([[ 0. , 1. , 0. ],
[ 0. , 0.1, 0.9],
[ 0.6, 0.4, 0. ]])
>>> for _ in xrange(100):
... u = np.dot(u,p)
... print u

再举一个例子,社会学家经常把人按其经济状况分为3类:下层(lower-class)、中层(middle-class)、上层(upper-class)。我们用1,2,3分别代表这三个阶层。社会学家们发现决定一个人的收入阶层的最重要的因素就是其父母的结束阶层。如果一个人的收入属于下层类别,那么他的孩子属于下层收入的概率是 0.65,属于中层收入的概率是 0.28,属于上层收入的概率是 0.07。事实上,从父代到子代,收入阶层的变化的转移概率如下:

 
 
 
 

同理,图中的转换关系可以用一个概率转换矩阵 p 表示,如下:

 
 

假设当前这一代人处在下层、中层、上层的概率分布向量是:

 
 

那么他们的子女的分布比例将是:

 
 

他们的孙子代的分布比例将是:

 
 

以此类推,第 n 代子孙的收入分布比例将是:

 
 

我们举个具体的例子,假设初始概率分布为:

 
 

则我们可以计算前 n 代人的分布状况如下:

 
 
>>> x
array([ 0.21, 0.68, 0.11])
>>> p
array([[ 0.65, 0.28, 0.07],
[ 0.15, 0.67, 0.18],
[ 0.12, 0.36, 0.52]])
>>> for _ in xrange(10):
... x = np.dot(x,p)
... print x
...
[ 0.2517 0.554 0.1943]
[ 0.270021 0.511604 0.218375]
[ 0.27845925 0.49699556 0.22454519]
[ 0.28249327 0.49179188 0.22571485]
[ 0.28447519 0.48985602 0.22566879]
[ 0.28546753 0.48909735 0.22543512]
[ 0.28597071 0.48878278 0.22524651]
[ 0.28622796 0.488645 0.22512704]
[ 0.28636017 0.48858171 0.22505812]
[ 0.28642834 0.48855152 0.22502014]

我们发现从第7代人开始,这个分布就稳定不变了,事实上,在这个问题中,从任意初始概率分布开始都会收敛到这个稳定的结果。也就是说,收敛的行为和初始概率分布 π0 无关。这说明这个收敛行为主要是由概率转移矩阵 P 决定的。我们可以计算一下 P^n :

 
 

我们发现,当 n 足够大的时候,这个 P^n 矩阵的每一行都是稳定地收敛到 π=[0.286,0.489,0.225] 这个概率分布。自然的,这个收敛现象并非是我们这个马氏链都有的,而是绝大多数马氏链的共同行为,关于马氏链的收敛我们有如下漂亮的定理:

 
 

这个马氏链的收敛定理非常重要,所有的MCMC(Markov Chain Monte Carlo)方法都是以这个定理作为理论基础的。

对于给定的概率分布 p(x) ,我们希望能与便捷的方式生成它对应的样本。由于马氏链能收敛到平稳分布,于是一个很漂亮的想法就是:如果我们能构造一个转移矩阵为 P 的马氏链,使得该马氏链的平稳分布恰好是 p(x),那么我们从任何一个初始状态 x(0) 出发沿着马氏链转移,得到一个转移序列 x(0),x(1),x(2),...,x(n),x(n+1),...,如果马氏链在第 n 步已经收敛了,于是我们就得到了 π(x) 的样本 x(n),x(n+1),...。

这个绝妙的想法在1953年被 Metropolis想到了,为了研究粒子系统的平稳性质, Metropolis 考虑了物理学中常见的波尔兹曼分布的采样问题,首次提出了基于马氏链的蒙特卡罗方法,即Metropolis算法,并在最早的计算机上编程实现。Metropolis 算法是首个普适的采样方法,并启发了一系列 MCMC方法,所以人们把它视为随机模拟技术腾飞的起点。 Metropolis的这篇论文被收录在《统计学中的重大突破》中, Metropolis算法也被遴选为二十世纪的十个最重要的算法之一。

我们接下来介绍的MCMC 算法是 Metropolis 算法的一个改进变种,即常用的 Metropolis-Hastings 算法。由上一节的例子和定理我们看到了,马氏链的收敛性质主要由转移矩阵 P 决定, 所以基于马氏链做采样的关键问题是如何构造转移矩阵 P,使得平稳分布恰好是我们要的分布p(x)。如何能做到这一点呢?我们主要使用如下的定理。

 
 

其实这个定理是显而易见的,因为细致平稳条件的物理含义就是对于任何两个状态 i,j, 从 i 转移出去到 j 而丢失的概率质量,恰好会被从 j 转移回 i 的概率质量补充回来,所以状态 i 上的概率质量 π(i) 是稳定的,从而 π(x) 是马氏链的平稳分布。数学上的证明也很简单,由细致平稳条件可得:

 
 

由于 π 是方程 πP=π 的解,所以 π 是平稳分布。

假设我们已经有一个转移矩阵为 Q 的马氏链(q(i,j)表示从状态 i 转移到状态 j 的概率,也可以写为 q(j|i) 或者q(i→j)),显然,通常情况下:

 
 

也就是细致平稳条件不成立,所以 p(x) 不太可能是这个马氏链的平稳分布。我们可否对马氏链做一个改造,使得细致平稳条件成立呢?譬如,我们引入一个 α(i,j), 我们希望:

 
 

取什么样的 α(i,j) 以上等式能成立呢?最简单的,按照对称性,我们可以取:

 
 

于是(*)式就成立了。所以有:

 
 

于是我们把原来具有转移矩阵 Q 的一个很普通的马氏链,改造为了具有转移矩阵 Q′ 的马氏链,而 Q′ 恰好满足细致平稳条件,由此马氏链 Q′ 的平稳分布就是 p(x)!

在改造 Q 的过程中引入的 α(i,j) 称为接受率,物理意义可以理解为在原来的马氏链上,从状态 i 以 q(i,j) 的概率转跳转到状态 j 的时候,我们以 α(i,j) 的概率接受这个转移,于是得到新的马氏链 Q′ 的转移概率为 q(i,j)α(i,j) 。

 
马氏链转移和接受概率

假设我们已经有一个转移矩阵 Q (对应元素为 q(i,j) ), 把以上的过程整理一下,我们就得到了如下的用于采样概率分布 p(x) 的算法。

 
 

上述过程中 p(x),q(x|y) 说的都是离散的情形,事实上即便这两个分布是连续的,以上算法仍然是有效,于是就得到更一般的连续概率分布 p(x)的采样算法,而 q(x|y) 就是任意一个连续二元概率分布对应的条件分布。

以上的 MCMC 采样算法已经能很漂亮的工作了,不过它有一个小的问题:马氏链 Q 在转移的过程中的接受率 α(i,j) 可能偏小,这样采样过程中马氏链容易原地踏步,拒绝大量的跳转,这使得马氏链遍历所有的状态空间要花费太长的时间,收敛到平稳分布 p(x) 的速度太慢。有没有办法提升一些接受率呢?

假设 α(i,j)=0.1,α(j,i)=0.2, 此时满足细致平稳条件,于是

 
 

上式两边扩大5倍,我们改写为

 
 

看,我们提高了接受率,而细致平稳条件并没有打破!这启发我们可以把细致平稳条件(**) 式中的 α(i,j),α(j,i) 同比例放大,使得两数中最大的一个放大到1,这样我们就提高了采样中的跳转接受率。所以我们可以取:

 
 

这个公式可以进一步简化为下面的公式:

 
 

于是,经过对上述MCMC 采样算法中接受率的微小改造,我们就得到了如下教科书中最常见的 Metropolis-Hastings 算法。

 
 

对于分布 p(x),我们构造转移矩阵 Q′ 使其满足细致平稳条件

 
 

此处 x 并不要求是一维的,对于高维空间的 p(x),如果满足细致平稳条件

 
 

那么以上的 Metropolis-Hastings 算法一样有效。

2. Gibbs Sampling算法

对于高维的情形,由于接受率 α 的存在(通常 α<1), 以上 Metropolis-Hastings 算法的效率不够高。能否找到一个转移矩阵 Q 使得接受率 α=1 呢?我们先看看二维的情形,假设有一个概率分布 p(x,y), 考察 x坐标相同的两个点 A(x1,y1),B(x1,y2),我们发现

 
 

所以得到

 
 

 
 

基于以上等式,我们发现,在 x=x1 这条平行于 y 轴的直线上,如果使用条件分布 p(y|x1) 做为任何两个点之间的转移概率,那么任何两个点之间的转移满足细致平稳条件。同样的,如果我们在 y=y1y=y1 这条直线上任意取两个点 A(x1,y1),C(x2,y1),也有如下等式

 
 
 
平面上马氏链转移矩阵的构造

于是我们可以如下构造平面上任意两点之间的转移概率矩阵 Q

 
 

有了如上的转移矩阵 Q, 我们很容易验证对平面上任意两点 X,Y, 满足细致平稳条件

 
 

于是这个二维空间上的马氏链将收敛到平稳分布 p(x,y)。而这个算法就称为 Gibbs Sampling 算法,是 Stuart Geman 和Donald Geman 这两兄弟于1984年提出来的,之所以叫做Gibbs Sampling 是因为他们研究了Gibbs random field, 这个算法在现代贝叶斯分析中占据重要位置。

 
 
 
 

Gibbs Sampling 算法中的马氏链转移

以上采样过程中,如图所示,马氏链的转移只是轮换的沿着坐标轴 x 轴和 y 轴做转移,于是得到样本 (x0,y0),(x0,y1),(x1,y1),(x1,y2),(x2,y2),⋯ 马氏链收敛后,最终得到的样本就是 p(x,y) 的样本,而收敛之前的阶段称为 burn-in period。额外说明一下,我们看到教科书上的 Gibbs Sampling 算法大都是坐标轴轮换采样的,但是这其实是不强制要求的。最一般的情形可以是,在 t 时刻,可以在 x 轴和 y 轴之间随机的选一个坐标轴,然后按条件概率做转移,马氏链也是一样收敛的。轮换两个坐标轴只是一种方便的形式。

以上的过程我们很容易推广到高维的情形,对于(***) 式,如果 x1 变为多维情形 x1,可以看出推导过程不变,所以细致平稳条件同样是成立的

 
 

此时转移矩阵 Q 由条件分布 p(y|x1) 定义。上式只是说明了一根坐标轴的情形和二维情形类似,很容易验证对所有坐标轴都有类似的结论。所以 n 维空间中对于概率分布 p(x1,x2,⋯,xn) 可以如下定义转移矩阵

  • 如果当前状态为 (x1,x2,⋯,xn),马氏链转移的过程中,只能沿着坐标轴做转移。沿着 xi 这根坐标轴做转移的时候,转移概率由条件概率 p(xi|x1,⋯,xi−1,xi+1,⋯,xn) 定义;

  • 其它无法沿着单根坐标轴进行的跳转,转移概率都设置为 0。

于是我们可以把Gibbs Smapling 算法从采样二维的 p(x,y) 推广到采样 n 维的 p(x1,x2,⋯,xn)

 
 

以上算法收敛后,得到的就是概率分布 p(x1,x2,⋯,xn) 的样本,当然这些样本并不独立,但是我们此处要求的是采样得到的样本符合给定的概率分布,并不要求独立。同样的,在以上算法中,坐标轴轮换采样不是必须的,可以在坐标轴轮换中引入随机性,这时候转移矩阵 Q 中任何两个点的转移概率中就会包含坐标轴选择的概率,而在通常的 Gibbs Sampling 算法中,坐标轴轮换是一个确定性的过程,也就是在给定时刻tt,在一根固定的坐标轴上转移的概率是1。


Reference:

Metropolis-Hastings 和 Gibbs sampling

随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

LDA-math-MCMC 和 Gibbs Sampling

Introduction to Monte Carlo Methods

An Introduction to MCMC for Machine Learning

作者:chen_h
链接:https://www.jianshu.com/p/27829d842fbc
來源:简书

【转载】MCMC和Gibbs Sampling算法的更多相关文章

  1. 机器学习方法(八):随机采样方法整理(MCMC、Gibbs Sampling等)

    转载请注明出处:Bin的专栏,http://blog.csdn.net/xbinworld 本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比 ...

  2. 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...

  3. 随机模拟MCMC和Gibbs Sampling

    随机模拟 统计模拟中有一个重要的问题就是给定一个概率分布 p(x),我们如何在计算机中生成它的样本.一般而言均匀分布 Uniform(0,1)的样本是相对容易生成的. 通过线性同余发生器可以生成伪随机 ...

  4. 随机采样方法整理与讲解(Acceptance-Rejection、MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...

  5. LDA-math-MCMC 和 Gibbs Sampling

    http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/ 3.1 随机模拟 随机模拟(或者统计模拟)方法有一个很酷的别名是蒙特卡罗方法(Mon ...

  6. 文本主题模型之LDA(二) LDA求解之Gibbs采样算法

    文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...

  7. 随机采样和随机模拟:吉布斯采样Gibbs Sampling

    http://blog.csdn.net/pipisorry/article/details/51373090 吉布斯采样算法详解 为什么要用吉布斯采样 通俗解释一下什么是sampling. samp ...

  8. Gibbs Sampling深入理解

    二维Gibbs Sampling算法 Gibbs Sampling是高维概率分布的MCMC采样方法.二维场景下,状态(x, y)转移到(x’, y’),可以分为三种场景 (1)平行于y轴转移,如上图中 ...

  9. Gibbs sampling

    In statistics and in statistical physics, Gibbs sampling or a Gibbs sampler is aMarkov chain Monte C ...

随机推荐

  1. ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  2. android#ListView的简单用法

    新建项目,并修改项目生产的主文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  3. python标准库之shutil——可操作权限的文件操作库

    转载自:https://www.jb51.net/article/145522.htm shutil模块提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能. 文件夹与文件操作 ...

  4. lua调用shell 脚本

    Lua中,os.execute可以执行dos命令,但是返回的是系统状态码,默认输出.io.popen()也可以执行dos命令,但是返回一个文件.eg: 复制代码 代码如下: local t = io. ...

  5. Node原生demo

    1.=>创建配置模块,作用是先判断是开发环境还是生产环境,并将开发或生产环境的数据库信息和http信息分别筛开,便于选择 2.=>创建数据库模块,作用是连接数据库 3.=>创建路由模 ...

  6. linux 静态库 ar命令用法

    当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量.这里介绍命令ar,用来对库操作. 1.ar基本用法 ar ...

  7. 【Python】【demo实验13】【练习实例】【暂停1s输出】

    原题: 暂停1s输出 使用time 模块: >>> dir(time) ['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__ ...

  8. 【Python】【demo实验8】【练习实例】【计算当天是当年的第几天】

    题目:输入某年某月某日,判断这一天是这一年的第几天? 程序分析: 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天: 对于年份,需 ...

  9. Lucky Sorting(CodeForces-109D)【思维】

    题意:给出一组数,要求从小到大排序,并且排序的过程中,发生交换的两个数至少一个为幸运数(十进制位均为4或7),问能否在(2×n)次交换内完成排序,如果能,输出交换的方案(不要求步骤数最少). 思路:首 ...

  10. Codeforces Round #586 (Div. 1 + Div. 2) D.Alex and Julian 简单证明

    题意:在序列中删除最少元素使得得到的图是二分图. 其中点是整数域的点. 比如b1=2   那么a可以连b当且仅当|a-b|=2 同时这里的a,b是任意整数. 怎样判定一个序列是否合法呢?于是想到了二分 ...