Maths | Metropolis-Hastings algorithm
Metropolis-Hastings algorithm
1. 随机模拟的基本思想
假设我们有一个矩形区域\(R\),面积为\(S_0\)。在此区域中,有一个不规则区域\(M\),其面积\(S\)待求。
方法1:把不规则区域\(M\)划分为多个小的规则区域,由这些规则区域的面积总和\(S'\)近似。
方法2:抓一把黄豆,均匀铺在\(R\)中,再统计落在不规则区域\(M\)中的黄豆比例。该比例可近似\(\frac{S}{S_0}\)。
方法2采用的是抽样(采样)解决问题的思想,即随机模拟。
因此,随机模拟的关键,在于如何将实际复杂问题,转化为抽样可以解决的问题。当然,这非常灵活,也考验我们的创造力。
我们接下来的核心问题,是利用计算机可直接实现的均匀抽样,借助随机模拟的方法,实现满足特定概率分布\(p(x)\)的抽样。
2. 拒绝抽样
当我们的概率分布很简单时,如\([0,1]\)上的均匀分布,抽样是很好实现的。现成的随机算法非常多。
但是,对于其他更复杂的分布,如果我们还想借助简单的均匀随机抽样,就需要换换思路了。

例如上图中的\(p(z)\)(忽略波浪号),是较为复杂的概率密度函数。
我们先构造比较简单的、容易抽样的高斯分布\(q(z)\),乘一个常数\(k\),使之满足:
\]
拒绝抽样的方法是:
对高斯分布的样本进行采样,得到一个\(z_0\),如图;
在\([0,kq(z_0)]\)上均匀采样,得到\(u_0\);
如果\(u_0 > p(z)\),就拒绝该采样结果;反之接受;
重复直到接受足够多的样本。
我们理解一下为什么拒绝抽样是可行的,这对我们之后运用随机模拟思想非常关键!
该简单分布与高斯分布的趋势大致相同,中间大两头小,因此取到中间的\(z\)的概率比较大;
通过\(u_0\)进一步筛选\(z\),\(p(z)\)较低时拒绝率较大,反之接受率较高,大致符合\(p(z)\)分布要求。
一句话,通过简单抽样和设置接受率,“强迫”结果趋于复杂分布。
这样,我们就通过简单的高斯分布采样,以及计算机可直接实现的均匀采样,间接实现了复杂的\(p(z)\)采样。
然而,在高维情况下,该方法的劣势很明显:
合适的简单分布\(q(z)\)很难找到。
合适的\(k\)值很难找到。
这两个问题会导致拒绝率极高,计算效率很低。其根本缺陷在于:样本之间是独立无关的。
3. Metropolis-Hastings抽样
3.1 引入思想
结合马氏链知识(参考信息论相关书籍),我们知道:
对于遍历的马尔可夫链,当其转移次数足够多时,将会进入稳态分布\(\pi (x)\),即各状态的出现概率趋于稳定。
进一步,假设变量\(\boldsymbol X\)所有可能的取值,构成某遍历马氏链的状态空间。
则无论从什么状态出发,只要转移步数足够大,该马氏链将趋于稳定,即逐渐开始依次输出符合\(p(x)\)分布的状态\(X_i\)。
这样,通过收集马氏链收敛后产生的\(X_i\),我们就得到了符合分布\(p(x)\)的样本。
此时稳态分布即\(\pi (x)=p(x)\)。
比如,我们希望抽样样本满足指数分布。此时,整数0到正无穷都是状态,但整数0的出现概率最大,随着数增大,出现概率越来越小。我们构造一个稳定输出服从指数分布状态的马氏链,则得到的样本服从指数分布。
这个绝妙的想法在1953年由Metropolis提出。为了研究粒子系统的平稳性质,Metropolis 考虑了物理学中常见的波尔兹曼分布的采样问题,首次提出了基于马氏链的蒙特卡罗方法(Metropolis算法),并在最早的计算机上编程实现。
Metropolis 算法是首个普适的采样方法,并启发了一系列 MCMC方法,所以人们把它视为随机模拟技术腾飞的起点。 Metropolis的这篇论文被收录在《统计学中的重大突破》中, Metropolis算法也被选为二十世纪的十个最重要的算法之一。
我们接下来介绍的MH算法是Metropolis 算法的一个常用的改进变种。
由于马氏链的收敛性质主要由转移矩阵\(\boldsymbol P\)决定, 所以基于马氏链做采样的关键问题是:如何构造转移矩阵\(\boldsymbol P\),使平稳分布恰好是我们要的分布\(p(x)\)。
3.2 理论基础:细致平稳条件
定理——细致平稳条件:
若非周期马氏链的转移矩阵\(\boldsymbol P\)和分布\(\pi (x)\)满足:
\]
则分布\(\pi (x)\)是马氏链的平稳分布。
证明:
\]
这说明:
\]
因此\(\pi (x)\)是平稳分布。
物理意义:
对于任意两个状态\(i,j\),从状态\(i\)流失到状态\(j\)的概率质量,等于反向流动的概率质量,因此是状态概率是稳定的。
3.3 M-H算法实现
假设我们已经有了一个转移矩阵\(\boldsymbol Q\)。一般情况下,该转移矩阵不满足细致平稳条件:
\]
我们引入接受率\(\alpha(i,j)\),满足:
\]
其中:
\(P(i)\)是状态\(i\)出现的概率,是假设马氏链满足复杂分布时输出状态的概率。
\(\boldsymbol Q\)是初始转移概率矩阵,满足任意一个给定的简单分布,便于抽样即可。
显然,接受率最简单的构造方法是:
\]
\]
此时,细致平稳条件成立,该马氏链输出的状态满足稳态分布\(p(x)\)!
综上,有几个要点必须要理解,有助于我们编程实现:
我们引入接受率,使得该马氏链以转移概率\(\boldsymbol Q_{ij}\alpha(i,j)\)从状态\(i\)转移到状态\(j\)。
该转移概率的实现方式是:我们先按\(\boldsymbol Q_{ij}\)生成新状态,再按\(\alpha(i,j)\)的概率接受转移结果,乘积即为\(\boldsymbol Q_{ij}\alpha(i,j)\)转移概率。
一定要理解这个接受率!在拒绝抽样中,如果\(u_0 > p(z)\),我们会放弃抽样结果,不纳入最终的统计。正是因为如此,抽样才会逼近复杂分布。而这里的接受是“接受转移”,如果\(u>\alpha\),意味着\(t+1\)时刻状态和\(t\)时刻相同,并且应该纳入统计而不是放弃结果!!
由于状态出现概率和转移概率满足细致平稳条件,因此状态出现概率即稳态分布概率。长期转移后,我们会得到想要的抽样分布效果。
图解转移过程:

要注意的是,当马氏链处在状态\(i\)时,我们并不知道如何选择下一个状态\(j\)。
我们在这里采用抽样的方法,并借助接受率,“强迫”转移过程逼近理想的遍历马氏链转移过程。
算法描述如下:
初始化马氏链状态\(X_0=x_0\)
从\(t=0\)开始,重复以下步骤:
假设该\(t\)时刻状态为\(X_t=x_t\);
对\(Q_{x_t,x}\)抽样,随机得到一个状态\(x_{next}\);
在\([0,1]\)上均匀抽样,得到一个\(u\);
若\(u<\alpha(x_t,x_{next})=P(x_{next})\boldsymbol Q_{x_{next},x_t}\),则接受转移\(X_{t+1}=x_{next}\);
否则不转移,即\(X_{t+1}=x_t\)。
3.4 算法升级
如果\(\alpha(x_t,x_{next})\)太小,会导致转移很难发生,马氏链收敛过慢。
我们回到细致平稳条件:
\]
我们希望在保持条件成立的前提下,使接受率尽量增大。
由于接受率的本质是概率,因此\(\alpha(i,j)\)和\(\alpha(j,i)\)中的较大者不应大于1。那么我们作下述改进即可:
\alpha(i,j)=min(buf,1)
\]
解释:
如果\(\alpha(i,j)\)更大,那么应设为1。而第一项大于1,因此\(\alpha(i,j)=1\),结束。
如果\(\alpha(j,i)\)更大,那么为了等式成立,\(\alpha(i,j)\)必须等于buf。而buf\(<1\),得逞~
综上,我们得到了升级版算法:

3.5 仿真实验
仿真目标:
用标准正态分布模拟指数分布(\(\lambda=0.1, \mu=\frac{1}{\lambda}=10\))。
简化:
由于高斯分布是一个径向基函数(取值仅仅依赖于离原点距离的实值函数),因此该矩阵是转置对称的,\(\boldsymbol Q_{ij}\)=\(\boldsymbol Q_{ji}\)
代码实现:
function SamplefromExponential
clc;close all;clear;
% 随意设
data_size=100000; % 越大越准
start=1; % 非负即可
% 初始化
data=start;
index=1;
% 直接生成多个服从均值为10的指数分布的样本
data_dir=exprnd(10,[1,data_size]);
figure;
subplot(1,2,1)
histogram(data_dir,'BinWidth',1);
axis([0,100,0,data_size/10]);
% 随机模拟
while(index<data_size)
u=rand; % 均匀抽样
data_next=normrnd(data(index),1); % 简单分布为标准正态分布
buf=exppdf(data_next,10)/exppdf(data(index),10);
alpha=min(1,buf);
if u<alpha
data=[data data_next];
else
data=[data data(index)];
end
index = index+1;
end
subplot(1,2,2)
histogram(data,'BinWidth',1);
axis([0,100,0,data_size/10]);
结果:

Maths | Metropolis-Hastings algorithm的更多相关文章
- Metropolis-Hastings算法
(学习这部分内容大约需要1.5小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC)是一种近似采样算法, 它通过定义稳态分布为 \(p\) 的马尔科夫链, 在 ...
- 为什么要用Markov chain Monte Carlo (MCMC)
马尔科夫链的蒙特卡洛采样的核心思想是构造一个Markov chain,使得从任意一个状态采样开始,按该Markov chain转移,经过一段时间的采样,逼近平稳分布stationary distrib ...
- Metropolis Hasting算法
Metropolis Hasting Algorithm: MH算法也是一种基于模拟的MCMC技术,一个非常重要的应用是从给定的概率分布中抽样.主要原理是构造了一个精妙的Markov链,使得该链的稳态 ...
- 蒙特卡洛马尔科夫链(MCMC)
蒙特卡洛马尔科夫链(MCMC) 标签: 机器学习重要性采样MCMC蒙特卡洛 2016-12-30 20:34 3299人阅读 评论(0) 收藏 举报 分类: 数据挖掘与机器学习(41) 版权声明: ...
- Gibbs sampling
In statistics and in statistical physics, Gibbs sampling or a Gibbs sampler is aMarkov chain Monte C ...
- LDA背景资料
[https://zhuanlan.zhihu.com/p/30226687] LDA模型的前世今生 在文本挖掘中,有一项重要的工作就是分析和挖掘出文本中隐含的结构信息,而不依赖任何提前标注的信息.L ...
- Markov Chain Monte Carlo Simulation using C# and MathNet
Math.Net Numerics has capability to conduct Markov Chair Monte Carlo simulations, yet the document i ...
- MCMC: The Metropolis Sampler
本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\) ...
- CF456B Fedya and Maths 找规律
http://codeforces.com/contest/456/problem/B CF#260 div2 B Fedya and Maths Codeforces Round #260 B. F ...
随机推荐
- background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时
网页需求是:50*50 如果只设置 width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...
- dubbo文档
Srping版Dubbo集成中文地址: https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html Spring ...
- java编程思想(1)--对象导论
对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...
- getColor问题
getResource.getColor(R.color.color_name) 过时了,可以使用新加入的方法 ContextCompat.getColor(context, R.color.colo ...
- leetcode979
搞不定这种递归计算,可能我的头脑是“线性”的,这种一层一层的,想起来太费劲了,想的头发都没了.以后希望能有AI来写这种程序吧,AI不怕掉头发! class Solution(object): def ...
- 如何将R中的data frame对象的数据导入到DB
在使用ARIMA模型来预测我们的销量的时候,如果保存预测版本进DB,以供后续分析呢 1. 在定义变量阶段我们定义了dfResult <- data.frame() 这是一个data f ...
- WD Elements 与 time machine
备份是很重要的问题. 之前买了一个 WD Elements,想要格式化成 HFS 的格式. 不然不能被 Time Machine 使用. 但是用磁盘工具不能成功,因为 EFI 分区的问题. 参考下面网 ...
- poj 1639 最小k度限制生成树
题目链接:https://vjudge.net/problem 题意: 给各位看一下题意,算法详解看下面大佬博客吧,写的很好. 参考博客:最小k度限制生成树 - chty - 博客园 https:/ ...
- python的条件语句
Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句…… el ...
- jqGrid的userData的用法!!!
在一次项目中想从后台自定义一些返回值传回jqGrid,所以就想到了jqGrid的这个userData属性,但是真的是坑了我好惨,这里记录一下! 1.首先看说明,这个jsonReader的默认配置,us ...