从期望到蒙特卡洛再到抽样(MCMC学习和梳理)

2023-05-16

文章目录

    • 怎么计算期望
    • 用蒙特卡洛方法计算期望(积分)
    • 无法使用蒙特卡洛计算积分的情况——无法采样
      • 接受-拒绝采样
      • 重要性采样
      • MCMC
        • Metropolis Hasting算法实现
    • Reference

近期在学习MCMC(Markov Chain Monte Carlo)算法,但是看了网上的博客发现,大家都是在讲如何什么是马尔科夫链,如何构造马尔科夫链。这对于一个做工程的学生来说很不友好,相比于严谨的证明,我们更想知道这个算法是为了解决什么问题,应该如何使用。

  • 在这篇文章里面,我梳理了MCMC算法的发展之路 。

我们常常用期望值来估计一些未知的参数,然而期望值的积分有时候很难算,此时就出现了蒙特卡洛方法求取近似数值解。但是蒙特卡洛遇到了采样难的问题,因此出现了各种采样的方法,MCMC就是其中之一。

怎么计算期望

对于一个随机变量 X X X而言,它可以取许多许多数值,但是取到每个数值是有一定概率的。取到某些值的概率比较大,取到某些值的概率比较小,取到每个值的概率画成一张图就是概率密度图。通常,我们也会用随机变量的期望 E ( x ) E(x) E(x)来描述这个随机变量的性质,期望 E ( x ) E(x) E(x)的计算公式如下:
E ( X ) = ∫ x p ( x ) d x E(X) = \int xp(x)dx E(X)=xp(x)dx
如果这时候存在一个关于随机变量的函数 g ( x ) g(x) g(x),实际上 Y = g ( x ) Y=g(x) Y=g(x)也是个随机变量。此时期望 E ( Y ) = E [ g ( x ) ] E(Y)=E[g(x)] E(Y)=E[g(x)]可以用如下公式计算:
E ( Y ) = E [ g ( x ) ] = ∫ g ( x ) p ( x ) d x E(Y) = E[g(x)] = \int g(x)p(x)dx E(Y)=E[g(x)]=g(x)p(x)dx
其中, p ( x ) p(x) p(x)是随机变量 X X X的概率密度函数。

在这里,期望是一个积分的形式,当这个积分难以写出显式解(表达式)的时候,就可以用蒙特卡洛模拟的方法去近似计算这个积分值,从而计算出期望。

用蒙特卡洛方法计算期望(积分)

蒙特卡洛方法给出的计算积分的方法是:生成一系列服从 p ( x ) p(x) p(x)分布的 x i x_i xi,然后算出一系列 g ( x i ) g(x_i) g(xi),然后用这些值的平均值近似代替我想要的积分值。这篇博客里面写了证明,用公式描述就是:
E ( Y ) ≈ 1 N Σ i = 1 N g ( x i ) w h e r e   x i ∼ p ( x ) E(Y) \approx \frac{1}{N}\Sigma_{i=1}^{N}g(x_i) \\ where \ x_i \sim p(x) E(Y)N1Σi=1Ng(xi)where xip(x)
那么问题来了,应该怎么取服从 p ( x ) p(x) p(x)分布的 x i x_i xi呢?这里的 p ( x ) p(x) p(x)是概率密度函数(Probability Density Function, PDF),实际上如果能把概率密度函数写成概率分布函数(Cumulative Distribution Function, CDF)就方便了,CDF实际上就是PDF的积分。举个例子:

假设我们要取服从正态分布 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1)的100个样本 [ x 1 , . . . , x 100 ] [x_1,...,x_{100}] [x1,...,x100]。已知其PDF,由PDF计算出CDF如下图:

PDF-CDF

从CDF纵坐标上我们均匀取100个点(一般是用随机数均匀取值,见下图红色箭头),这100个点对应的横坐标值就是我们想要的 x i x_i xi(见下图蓝色箭头)。

CDF采样

无法使用蒙特卡洛计算积分的情况——无法采样

上文中提到的"生成一系列服从 p ( x ) p(x) p(x)分布的 x i x_i xi"就叫做采样,而写不出PDF,写不出CDF等情况,无法生成这样的 x i x_i xi就叫做无法采样。CDF是PDF的积分,如果这个PDF本身就很复杂,或者无法写出表达式,那CDF就写不出来了,就没法用上面的方法取服从服从 p ( x ) p(x) p(x)分布的 x i x_i xi了。举个无法写出CDF的例子:

下面这里例子里面,需要注意的是,上文中的 x i x_i xi变成了高维的随机变量。也就是说 x i = [ a 1 i , a 2 i , . . . , a 100 i ] x_i=[a_{1i},a_{2i},...,a_{100i}] xi=[a1i,a2i,...,a100i]

已知一个联合概率分布 p ( a 1 , a 2 , . . . , a 100 ) p(a_1,a_2,...,a_{100}) p(a1,a2,...,a100),其中每个 a a a的取值范围是 1 , 2 , 3 , . . . 50 1,2,3,...50 1,2,3,...50,其计算公式如下:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & p(a_1,a_2,..…

这个联合概率分布,分子上的 Z Z Z是一个归一化的常数,但是想算出这个常数就要把所有 a a a的取值都算一遍。分母上的 E E E写的比较简单,想表达的意思就是,这个函数我们知道,并且可以算出来,实际上可以用任何一个简单或者复杂的函数替代。

我们来分析一下这个联合概率分布:如果我们知道了一组 [ a 1 , a 2 , . . . , a 100 ] [a_1,a_2,...,a_{100}] [a1,a2,...,a100],那么直接带入公式。分子可以计算出来,但是分母要遍历所有 a a a的取值。实际上,分母硬算是可以算出来的,但是太复杂了。况且,把维度加一加,把取值范围加一加,把 E E E整一整,还能更加复杂,一年两年不知道能不能搞出来。这个例子里面,PDF都算不出,更别说CDF了,就更别提采样了。

为了解决无法采样的情况,就有了接受-拒绝采样、重要性采样、MCMC等方法。下面就写写这些方法是怎么解决这个问题的。

接受-拒绝采样

接受-拒绝采样并不能解决上面那个例子中的问题,但是它能解决“可以写出PDF,但是写不出CDF”的问题。也就是说,我们已知一个 x i x_i xi,就可以算出对应的 p ( x i ) p(x_i) p(xi)的数值,但是 ∫ p ( x ) d x \int p(x)dx p(x)dx算不出来。

回到我们最开始求期望的那个问题:
E ( Y ) = E [ g ( x ) ] = ∫ g ( x ) p ( x ) d x E(Y) = E[g(x)] = \int g(x)p(x)dx E(Y)=E[g(x)]=g(x)p(x)dx
既然我们无法"生成一系列服从 p ( x ) p(x) p(x)分布的 x i x_i xi",那我们"生成一系列服从 q ( x ) q(x) q(x)分布的 x i x_i xi",然后从这些 x i x_i xi中挑一部分,使得挑出来的 x i x_i xi服从 p ( x ) p(x) p(x)分布。其中 q ( x ) q(x) q(x)是一个我们已知且可采样的分布(例如 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1))。具体的操作如下:

  1. q ( x ) q(x) q(x)的CDF采样得到 x i x_i xi
  2. p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x)的概率接受当前这个 x i x_i xi,以某某概率接受的操作会在下面讲。
  3. 如果上一步不接受,则跳过这一步。如果上一步接受,则计算出 g ( x i ) g(x_i) g(xi)的值,并存储下来。
  4. 如果存储的 g ( x i ) g(x_i) g(xi)的值不够多,就回到1继续生成。如果够多了,那就下一步。
  5. E ( Y ) ≈ 1 N Σ i = 1 N g ( x i ) E(Y) \approx \frac{1}{N}\Sigma_{i=1}^{N}g(x_i) E(Y)N1Σi=1Ng(xi)计算出期望值

以某某概率接受其实很简单。假设以0.8的概率接受,那么就生成一个随机数(0-1之间均匀分布),如果这个数大于0.8,我就不接受,小于0.8就接受。

因为生成的 x i x_i xi有一部分被被扔掉了(被拒绝了),所以这个方法叫做接受-拒绝采样。

重要性采样

重要性采样并不能解决上面那个例子中的问题,但是它能解决“可以写出PDF,但是写不出CDF”的问题。也就是说,我们已知一个 x i x_i xi,就可以算出对应的 p ( x i ) p(x_i) p(xi)的数值,但是 ∫ p ( x ) d x \int p(x)dx p(x)dx算不出来。

回到我们最开始求期望的那个问题,我们把求期望的公式换个写法:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ E(Y) = E[g(x)]…
这里的 s ( x ) s(x) s(x)是一个我们已知的概率密度函数PDF(例如 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1)),而给定一个 x x x h ( x ) h(x) h(x)可以被算出来。因此只需要生成一系列“服从 h ( x ) h(x) h(x)分布的 x i x_i xi”,然后根据:
E ( Y ) ≈ 1 N Σ i = 1 N h ( x i ) w h e r e   x i ∼ s ( x ) E(Y) \approx \frac{1}{N}\Sigma_{i=1}^{N}h(x_i) \\ where \ x_i \sim s(x) E(Y)N1Σi=1Nh(xi)where xis(x)

即可算出期望值。

因为 h ( x ) = g ( x ) p ( x ) s ( x ) h(x) = g(x) \frac{p(x)}{s(x)} h(x)=g(x)s(x)p(x)中存在 p ( x ) s ( x ) \frac{p(x)}{s(x)} s(x)p(x),就像是给原来的 g ( x ) g(x) g(x)加了个权重,所以叫做重要性采样。

MCMC

MCMC方法可以解决上面那个例子中的问题,虽然分母算不出来,但是分子能算啊。MCMC中使用 p ( x ′ ) p ( x ) \frac{p(x')}{p(x)} p(x)p(x)带入计算,恰好使得分母抵消了。

MCMC方法很鸡贼,它构造了一个马尔科夫链。这个马尔科夫链在进入稳态后,虽然在各个状态之间跳转,但是跳转有一定规律:落在各个状态的概率服从某一分布。这个分布就是我们希望采样的 p ( x ) p(x) p(x)。而我们只需要让这个马尔科夫链不断跳转,然后把每一时刻它所在的状态记录下来,记录下来的状态 x i x_i xi就是我们想要的服从 p ( x ) p(x) p(x)分布的 x i x_i xi

MCMC主要包括Metropolis方法、Metropolis-Hasting方法以及Gibbs Sampling方法。其中M-H方法是对M方法的改进,而Gibbs是在做图像去噪的时候恰好采用了类似的思路,顺带改进了一下。下面就以H-C算法讲解一下其实现思路,算法原理可以在各种各样的博客里面找到。

Metropolis Hasting算法实现

  • 准备工作

首先准备一个提议分布 q ( x m ∣ x n ) q(x_{m}|x_{n}) q(xmxn),这个分布可以随便取,它代表的是从状态 x n x_{n} xn转移到状态 x m x_m xm的概率。换句话说就是,我们假设从状态 x n x_{n} xn转移到状态 x m x_m xm的概率是 q ( x m ∣ x n ) q(x_{m}|x_{n}) q(xmxn)

这个假设的分布 q q q显然不是我们想要的分布 p p p,因此这里借鉴一下接收-拒采样的想法。接收-拒绝抛弃一部分 x i x_i xi,而H-C不接受一部分状态转移。换句话说就是,按照 α \alpha α的概率接受状态转移。其中:
α = m i n ( 1 , p ( x ′ ) q ( x ∣ x ′ ) p ( x ) q ( x ′ ∣ x ) ) \alpha = min(1, \frac{p(x')q(x|x')}{p(x)q(x'|x)}) α=min(1,p(x)q(xx)p(x)q(xx))

  • 实现步骤
  1. 随机选一个状态 x x x
  2. 按照概率分布 q q q跳到一个新的状态 x ′ x' x(从一个状态跳转到另一个状态的概率是 q q q,这里就是按照概率跳转到下一个状态)。
  3. 计算 α = m i n ( 1 , p ( x ′ ) q ( x ∣ x ′ ) p ( x ) q ( x ′ ∣ x ) ) \alpha = min(1, \frac{p(x')q(x|x')}{p(x)q(x'|x)}) α=min(1,p(x)q(xx)p(x)q(xx)),然后以 α \alpha α的概率跳转到下一状态。如果结果是跳转,那么记录下这个状态 x ′ x' x,并把当前状态 x x x更新为 x ′ x' x;如果结果是不跳转,那么就不记录。
  4. 回到2,直到记录的数据数量足够。
  5. 记录下的一堆 x ′ x' x就是服从 p ( x ) p(x) p(x)分布的 x i x_i xi

Reference

[1] 如何理解 重要性采样(importance sampling)

[2] particle filtering—粒子滤波(讲的很通俗易懂)

[3] N. Metropolis et al (1953). Equations of state calculations by fast computing machines(Metropolis算法原始论文)

[4] Hastings, W. K. (1970). Monte Carlo sampling methods using Markov chains and their applications(Metropolis-Hasting算法原始论文)

[5] Geman, S. and Geman, D. (1984). Stochastic relaxation, Gibbs distributions and the Bayesian restoration of images(Gibbs Sampling算法原始论文)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从期望到蒙特卡洛再到抽样(MCMC学习和梳理) 的相关文章

随机推荐

  • Mavlink协议理解Pixhawk APM(二)

    本文是第二篇博客 xff0c 本系列博客共三篇 本文介绍mavlink里消息的种类和如何看懂开始时提到的那个官方的mavlink消息介绍https pixhawk ethz ch mavlink 有问题请回复评论 xff0c 然后邮箱提醒我
  • SqlServer数据库导入Excel数据:openrowset

    导入代码 xff1a declare 64 sql nvarchar 2000 declare 64 f excel varchar 100 set 64 f excel 61 39 导入文件名称 xlsx 39 IF EXISTS SEL
  • 安装ROS, 初始化时rosdep update出错解决办法

    背景 xff1a ubuntu上安装ROS xff0c 不管是在ubuntu16 04上装kinetic xff0c 还是在18 04上装melodic xff0c 安装完毕后 xff0c 进行初始化时 xff0c 反复失败 xff0c 试
  • Intel RealSense D435介绍、安装和使用

    实验室采购的三个Intel RealSense相机到了 xff0c 分别是D435 R200和blasterx senz3d xff0c 都试了一下 xff0c 除了适用的最佳距离范围不同 xff0c 其它功能大致相同 xff0c 用SDK
  • 配置适用于HoloLens开发的unity工程

  • HoloLens世界锚资料

    1 Unity 中的本地定位点传输 xff1a Unity 中的本地定位点传输 Mixed Reality Microsoft Docs https docs microsoft com zh cn windows mixed realit
  • HoloLens 2 之 Unity 开发基础入门指南

    研发实战 xff1a HoloLens 2 之 Unity 开发基础入门指南 知乎 查看 引用 信息源请点击 xff1a 映维网关于混合现实基础入门的指南 xff08 中文版 xff09 xff08 映维网 2021年03月15日 xff0
  • PCL学习资料

    01 代码学习博主 xff1a PCL读取PCD文件的数据 慕尘 博客园 1 pcd文件 rabbit pcd 链接 xff1a https pan baidu com s 1v6mjPjwd7fIqUSjlIGTIGQ 提取码 xff1a
  • obj文件格式与.mtl文件格式

    1 OBJ 是一种 3D模型文件 xff0c 因此不包含动画 材质特性 贴图路径 动力学 粒子等信息 但是可以读取 mtl 文件来获得材质信息 2 OBJ 文件使用 关键字根据数据类型排列 xff0c 每个关键字有一段简短描述 顶点数据 V
  • opencv_aruco

    文章参考 xff1a ArUco 木筏筏筏的博客 CSDN博客 aruco 1 01 显示识别mark cpp include lt opencv2 highgui hpp gt include lt opencv2 aruco hpp g
  • 详细图解,卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

    博客园 xff1a https www cnblogs com baiduboy p 14234884 html
  • ORB角点检测--快速近似最近邻(FLANN)匹配--c++

    描述子匹配 图像特征检测首先会获取关键点 xff0c 然后根据关键点周围像素ROI区域的大小 xff0c 生成描述子 xff0c 完整的描述子向量就表示了一张图像的特征 xff0c 是图像特征数据 xff0c 这种方式也被称为图像特征工程
  • 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信 同步和互斥的最优选择 xff0c 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 VxWorks提供3种信号量来解决不同的问题 二进制信号量 xff1a 最快
  • WiFi智能开关方案

    伴随着物联网的蓬勃发展 xff0c 智能家居成为备受瞩目的新兴领域 xff0c 越来越多的智能产品进入消费市场并受到了广大用户的青睐 xff0c 用于控制设备状态的传统机械开关也面临智能化升级 市面上出现了各种各样的智能开关 xff0c 以
  • VNect: Real-time 3D Human Pose Estimation with a Single RGB Camera

    采用了两个CNN 第一个是卷积神经网络 CNN xff0c 在残缺的单目捕捉条件下返回二维和三维关节位置 xff1b 这是基于标记的3D人体数据集以及补充的2D人体姿态数据集训练的 xff0c 提升了捕捉性能 xff1b 第二部分结合回归的
  • 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析

    参考文献 1 野火 uCOS III 内核实现与应用开发实战指南 基于STM32 xff1b 2 CM3 权威指南CnR2 xff08 电子版 xff09 Cortex M3 权威指南 Joseph Yiu 著 宋岩 译 xff1b 两个指
  • RTOS任务调度思想汇总_2(任务时间管理)

    1 任务是独立的 xff0c 并且初始化后进入死循环 格式像主函数 xff1b 2 任务的任务控制块 xff1a 首先要定义每个任务的任务控制块变量 xff0c 任务控制块只是一个数据类型 数据结构 xff0c 其数据结构定义的元素有任务堆
  • C++类与对象之静态成员和静态成员函数

    C 43 43 面向对象编程中 xff0c 静态成员也是较为重要的 C 43 43 的变量存储区除了堆区和栈区之外 xff0c 还存在静态存储区 xff0c 用于存放static静态变量 xff0c 全局变量以及常量 xff0c 生命周期是
  • MC9S12G128模块化分层化软件架构之七_外部中断

    文章目录 内容 1 overview 1 1 目的 2 优化内容 2 1 软件功能 2 2 编程健壮性 3 软件实现 3 1 Coding Rule 3 2 中断基础知识 3 2 1 mc9s12g128的中断向量号 3 2 2 mc9s1
  • 从期望到蒙特卡洛再到抽样(MCMC学习和梳理)

    文章目录 怎么计算期望用蒙特卡洛方法计算期望 xff08 积分 xff09 无法使用蒙特卡洛计算积分的情况 无法采样接受 拒绝采样重要性采样MCMCMetropolis Hasting算法实现 Reference 近期在学习MCMC Mar