如何做Gibbs采样(how to do gibbs-sampling)
原文地址:《如何做Gibbs采样(how to do gibbs-sampling)》
随机模拟
随机模拟(或者统计模拟)方法最早有数学家乌拉姆提出,又称做蒙特卡洛方法。蒙特卡洛是一个著名的赌场,赌博总是和统计有着密切的关系,所以这个命名风趣而贴切,被广为接受。
随机模拟的一个重要问题就是给定一个概率分布\(p(x)\),如何生成它的样本。均匀分布\(Uniform(0,1)\)的样本可以通过线性同余发生器生成的伪随机数来模拟。常见的概率分布,无论是离散的还是连续的分布,都可以基于\(Uniform(0,1)\)的样本经过变换生成。
然而,当概率分布\(p(x)\)的形式很复杂或者\(p(x)\)是个高维分布的时候,样本的生成就会变得困难。此时就需要一些更加复杂的随机模拟方法来生成样本。接下来将会介绍下MCMC(Markov Chain Monte Carlo)和Gibbs Sampling算法。
马尔科夫链及其平稳分布
马尔科夫链的数学定义如下:
\[P(X_{t+1}=x| X_t, X_{t-1},...) = P(X_{t+1}| X_t)\]
定理 如果一个非周期马尔科夫链具有转移概率矩阵\(P\),且它的任何两个状态是连通的,那么
$\lim_{n\rightarrow \infty}{P^n}=\left[\begin{array}{ccccc}\pi(1) & \pi(2) &...&\pi(j)&...\\\pi(1) & \pi(2) &...&\pi(j)&...\\...&...&...&...&...\\\pi(1) & \pi(2) &...&\pi(j)&...\\...&...&...&...&...\\\end{array}\right].$
- \(\pi(j)=\sum_{i=0}^{\infty}{\pi(i)P_{ij}}\).
- \(\pi\)是方程\(\pi P=\pi\)的唯一非负解,其中\(\pi =[\pi(1), \pi(2), ..., \pi(j), ...], \sum_{i=0}^{\infty}{\pi_i} = 1.\)
\(\pi\)称为马尔科夫链的平稳分布。
收敛到平稳分布
从初始概率分布\(\pi_0\)出发,我们在马尔科夫链上做状态转移,记\(X_i\)的概率分布为\(\pi_i\),则有
\begin{array}{cc}X_0\sim \pi_0(x)& \\X_i\sim \pi_i(x),& \pi_i(x) = \pi_{i-1}(x)P=\pi_0(x)P^i\end{array}
由马尔科夫链收敛的定理,概率分布\(\pi_i(x)\)将收敛到平稳分布\(\pi(x)\)。假设到第\(n\)步的时候马尔科夫链收敛,则有
\begin{array}{l}X_0 \sim \pi_0(x)\\X_1\sim \pi_1(x)\\...\\X_n\sim \pi_n(x) = \pi(x)\\X_{n+1}\sim \pi(x)\\X_{n+2}\sim \pi(x)\\...\end{array}
所以\(X_n,X_{n+1},X_{n+2},...\sim \pi(x)\)都是属于同分布的随机变量,当然他们并不是独立的。如果从\(x_0\)开始沿着马尔科夫链按照概率转移矩阵跳转,那么我们将会得到一个转移序列\(\{x_0,x_1,...,x_n,x_{n+1},...\}\),由于马尔科夫链具有收敛性,所以\(\{x_{n},x_{n+1},...\}\)都是平稳分布\(\pi(x)\)的样本。
MCMC
定理(细致平稳条件) 如果非周期马尔科夫链的转移矩阵P和分布\(\pi(x)\)满足
\[\pi(i)P_{ij}=\pi(j)P_{ji}, ~for~all~ i,j\]
则\(\pi(x)\)是马尔科夫链的平稳分布,上式被称为细致平稳条件。
假设我们已经有了一个转移矩阵为\(Q\)的马尔科夫链(\(q(i\rightarrow j)\) 表示从状态\(i\)转移到状态\(j\)的概率),\(p(x)\)表示当前的概率分布\(\pi\),显然通常情况下:
\[p(i)q(i\rightarrow j) \ne p(j)q(j\rightarrow i)\]
也就是细致平稳条件不成立,所以\(p(x)\)不太可能是马尔科夫链的平稳分布。为了能够对\(p(x)\)进行抽样,我们必须对马尔科夫链进行改造,使得细致平稳条件成立。比如,引入一个接受率\(\alpha(i,j)\)使得
\[p(i)q(i\rightarrow j)\alpha(i,j) = p(j)q(j\rightarrow i)\alpha(j,i)\]
最简单的按照对称性,我们可以取如下\(\alpha(i,j),\alpha(j,i)\)使得上式成立
\[\alpha(i,j)=p(j)q(j\rightarrow i), ~ \alpha(j,i)=p(i)q(i\rightarrow j)\]
我们可以理解这个改造过程为在原来的马尔科夫链上,从状态\(i\)以概率\(q(i\rightarrow j)\)转移到状态\(j\)时,以概率\(\alpha(i,j)\)接受这个转移。所以新的马尔科夫链\(Q^\prime\)的转移概率为\(q(i\rightarrow j)\alpha(i,j)\)。
上面的改造还有一个小小的问题:马尔科夫链的接受率\(\alpha(i,j)\)在转移过程中可能会偏小,如果这样子采样过程中马尔科夫链容易原地踏步,拒绝大量跳转,致使收敛速度太慢。为了提高采样的接受率,我们可以对接受率进行细微的修改:\[\alpha(i,j)=\min \left \\{ \frac{p(j)q(j\rightarrow i) }{p(i)q(i\rightarrow j )}, 1 \right \\}.\]
Metropolis-Hastings采样算法
- 初始化马尔科夫链初始状态\(X_0=x_0\)
- 对t=0,1,2...,循环以下过程进行采样
- 第t时刻马尔科夫链状态\(X_t=x_t\),采样\(y\sim q(x|x_t)\)
- 从均匀分布中采样\(u\sim Uniform(0,1)\)
- 如果\(u\lt \alpha(x_t,y)\)则接受转移\(x_t \rightarrow y\),即\(X_{t+1} = y\)
- 否则不接受转移,即\(X_{t+1}=x_t\)
Gibbs Sampling
上述的Metropolis-Hasting算法也可以被应用与高维的场景,但是由于接受率的存在,算法的效率仍然较低。Gibbs Sampling,找到了一个接受率为1的转移矩阵。考察二维的情形,假设概率分布为\(p(x,y)\)。给定\(x\)坐标相同的两个点\(A(x_1,y_1),B(x_1,y_2)\)不难发现
\[
\begin{array}{c}
p(x_1,y_1)p(y_2|x_1)=p(x_1)p(y_1|x_1)p(y_2|x_1)\\\\
p(x_1,y_2)p(y_1|x_1)=p(x_1)p(y_2|x_1)p(y_1|x_1)\\\\
p(x_1,y_1)p(y_2|x_1) = p(x_1,y_2)p(y_1|x_1)\\\\
\end{array}
\]
也就是\(p(A)p(y_2|x_1)=p(B)p(y_1|x_1)\)。也就是说给定\(x=x_1\)这条平行于\(y\)轴的直线,使用分布\(p(y|x_1\)作为这条直线上任意两点的转移概率,该分布满足细致平稳条件。同样,对于点\(A(x_1,y_1),C(x_2,y_1)\)我们也可以得到\(p(A)p(x_2|y1)=p(C)p(x_1|y_1)\)。
构造如下转移矩阵
\[
\begin{array}{l}
Q(A\rightarrow B) = p(y_B|x_1)\\\\
Q(A\rightarrow C) = p(x_C|y_1)\\\\
Q(A\rightarrow D) = 0
\end{array}
\]
显然上面的转移矩阵\(Q\)满足细致平稳条件。于是这个二维的马尔科夫链将会收敛到平稳分布\(p(x,y)\)。这个算法被称为Gibbs Sampling,是由德国物理学家Gibbs首先提出的。
二维的算法很容易扩展到\(n\)维空间。对于\(n\)维空间的概率分布\(p(x_1,x_2,...,x_n)\)的转移矩阵如下:
- 对于当前状态\((x_1,x_2,...,x_n)\),马尔科夫链只能沿着坐标轴转移。比如,但状态沿着\(x_i\)转移时,其马尔科夫链转移概率为\(p(x_i|x_1,...,x_{i-1},x_{i+1},...,x_n)\)。
- 其它无法沿着坐标轴进行跳转的转移概率均为0。
n维Gibbs Sampling算法
- 随机选取一个初始状态\((x_1,x_2,...,x_n)\)
- 对t=0,1,2... 循环采样:
- \(x_1^{(t+1)}\sim p(x_1|x_2^{(t)},x_3^{(t)},...,x_n^{(t)})\)
- \(x_2^{(t+1)}\sim p(x_2|x_1^{(t+1)},x_3^{(t)},...,x_n^{(t)})\)
- ...
- \(x_j^{(t+1)}\sim p(x_j|x_1^{(t+1)},x_2^{(t+1)},...,x_{j-1}^{(t+1)},x_{j+1}^{(t)},...,x_n^{(t)})\)
- ...
- \(x_n^{(t+1)}\sim p(x_n|x_1^{(t+1)},x_2^{(t+1)},...,x_{n-1}^{(t+1)})\)
如何做Gibbs采样(how to do gibbs-sampling)的更多相关文章
- 文本主题模型之LDA(二) LDA求解之Gibbs采样算法
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...
- MC, MCMC, Gibbs采样 原理&实现(in R)
本文用讲一下指定分布的随机抽样方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,并用R语言实现了几个例 ...
- MCMC(四)Gibbs采样
MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)MCMC采样和M-H采样 MCMC(四)Gibbs采样 在MCMC(三)MCMC采样和M-H采样中,我们讲到了M-H采样已经可以很好 ...
- Gibbs采样
(学习这部分内容大约需要50分钟) 摘要 Gibbs采样是一种马尔科夫连蒙特卡洛(Markov Chain Monte Carlo, MCMC)算法, 其中每个随机变量从给定剩余变量的条件分布迭代地重 ...
- 关于LDA的gibbs采样,为什么可以获得正确的样本?
算法里面是随机初始了一个分布,然后进行采样,然后根据每次采样的结果去更新分布,之后接着采样直到收敛. 1.首先明确一下MCMC方法. 当我们面对一个未知或者复杂的分布时,我们经常使用MCMC方法来进行 ...
- Gibbs 采样的应用
Gibbs 采样的最大作用在于使得对高维连续概率分布的抽样由复杂变得简单. 可能的应用: 计算高维连续概率分布函数的数学期望, Gibbs 采样得到 n 个值,再取均值: 比如用于 RBM:
- Gibbs 采样定理的若干证明
坐标平面上的三点,A(x1,y1),B(x1,y2),C(x2,y1),假设有概率分布 p(x,y)(P(X=x,Y=y) 联合概率),则根据联合概率与条件概率的关系,则有如下两个等式: {p(x1, ...
- 机器学习进阶-图像金字塔与轮廓检测-图像金字塔-(**高斯金字塔) 1.cv2.pyrDown(对图片做向下采样) 2.cv2.pyrUp(对图片做向上采样)
1.cv2.pyrDown(src) 对图片做向下采样操作,通常也可以做模糊化处理 参数说明:src表示输入的图片 2.cv2.pyrUp(src) 对图片做向上采样操作 参数说明:src表示输入的 ...
- MCMC:Gibbs 采样(matlab 实现)
MCMC: The Gibbs Sampler 多元高斯分布的边缘概率和条件概率 Marginal and conditional distributions of multivariate norm ...
随机推荐
- 你需要知道的九大排序算法【Python实现】之选择排序
一.选择排序 基本思想:选择排序的思想非常直接,不是要排序么?那好,我就从所有序列中先找到最小的,然后放到第一个位置.之后再看剩余元素中最小的,放到第二个位置--以此类推,就可以完成整个的排序工作了. ...
- MySQL 二进制日志(Binary Log)
同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分. MySQL有几种不同的日志文件.通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志能够帮助我们定位mysqld ...
- (原创)初识cordova(一)
在公司做项目,发现有人在做大项目使用了cordova技术.做的是昆山的项目.之前听说过phonegap,也测试过,但是感觉效率不是很好,就没怎么研究,后来看他们做的项目还不错,于是想试一试. 搭建开发 ...
- 【反射】Reflect 介绍 示例
介绍 JAVA反射机制是指:在运行状态中,对于任意一个[类],都能够知道这个类的所有属性和方法:对于任意一个[对象],都能够调用它的所有属性和方法:这种[动态]获取类中的信息以及动态调用对象的成员的功 ...
- 【socket.io研究】3.手机网页间聊天核心问题
前面我们已经说了服务器相关的一些内容,且又根据官网给出的一个例子写了一个可以聊天的小程序,但是这还远远不够呀,这只能算是应用前的准备工作.接下来,一起来考虑完善一个小的聊天程序吧. 首先,修改服务器的 ...
- zookeeper端口号冲突:8080冲突
端口号冲突,在conf/zoo2181.cfg文件里面添加一个端口号的指定(具体的端口号可以自己定义一个): admin.serverPort=8081
- Swift中的便利构造器和构造器链
import UIKit // 1.一个类中至少有一个指定构造器, 其必须负责初始化类中所有的实例存储属性 // 2.便利构造器属于次要的, 辅助性的构造器 // 3.类中可以不定义便利构造器, 便利 ...
- java下载文件
/** * * @param file * @param response */ private void downLoad(File file, HttpServletResponse respon ...
- Enumeration
Interface Enumeration<E> hasMoreElements() boolean hasMoreElements() 仅当此枚举对象包含至少一个以上元素为真:否则 ...
- Struts2 过滤器与拦截器
学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下. 过滤器,是在java web中,你传入的request,re ...