MCMC_方法与示例

本文介绍了MCMC(马尔科夫链蒙特卡洛)方法的基本原理及其在复杂分布抽样中的应用。首先概述了MCMC的概念及重要性,接着详细讲解了随机抽样、蒙特卡洛模拟、马尔科夫链等相关理论。并通过具体示例说明了MCMC采样、M-H方法及Gibbs方法的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.摘要

MCMC,也称为马尔科夫链蒙特卡洛(Markov Chain Monte Carlo)方法,是用于从复杂分布中获取随机样本的统计学算法。正是MCMC方法的提出使得许多贝叶斯统计问题的求解成为可能。MCMC方法是一类典型的在编程上容易实现,但原理的解释和理解却相对困难的统计学方法。对于这类方法,如果不能够理解其内部原理便难以在实践过程中进行应用。本文会分别就两个MC进行理论介绍,而后对MCMC方法进行阐述,最后通过实例演示应用过程。此外本文中算法示例的编程语言为R。

2.随机抽样

2.1随机性

随机性的获取实际上并不像我们以为的那样容易,计算指定一个点的概率质量(概率密度)容易,但要随机的算一堆点就要在保证随机性上做很多工作。
一条解决路径是从简单分布中抽取随机样本,然后通过某种变换映射到目标分布中去。比如服从均匀分布的样本可以通过Box-Muller变换映射到正态分布中去,那么为了获取服从正态分布的样本就可以先从均匀分布中抽样再进行变换。那么该如何从均匀分布中进行随机抽样呢?工程上可以通过线性同余发生器来生成服从均匀分布的伪随机数。事实上,许多常用分布都可以通过均匀分布变换而来。

如何手工获取随机数?

当然通常为了获取服从某个分布的样本都是直接使用现成的程序库,并不用关心程序背后的原理。但问题是在实践中并不是所有分布都能够在标准的程序库中找到相应的方法,甚至有些分布的形式都无显式的用公式进行表示。这时候MCMC就派上用场了。

3.蒙特卡洛模拟

3.1 步骤

蒙特卡洛模拟是一类通过随机抽样过程来求取最优解的方法的总称,如果建立蒙特卡洛模型的过程没有出错,那么抽样次数越多,得到的答案越精确。蒙特卡洛模拟的实现,可以归纳为如下三个步骤:

  • a 将欲求解问题转化为概率过程。
  • b 从已知分布中抽样
  • c 通过样本计算各类统计量,此类统计量就是欲求问题的解。

3.2 示例

3.2.1问题

上学的时候经常听闻某某班级里有那么几个人生日居然是在同一天,感觉很巧。或许我们在一些场合下也经常遇到与自己同一天生人,通常人们都会将之解读为“缘分”。不过所谓能够得上“缘分”的事情,应该都是小概率事件,下面就用蒙特卡洛的方式算算看,到底概率几何。
问题提出:将新生随机分配,构成一个60人的班级,求解任何两个人的生日都不在同一天的概率。

3.2.2求解

构建蒙特卡洛过程:

  1. 由于学生是随机分配到一个班级的,所以每个人的出生日期是独立的,并且是从1~365之内等概率取值的。构造统计量 B ∼ P 365 ( p 1 , p 2 , … , p 365 ) , p 1 = p 2 = , … , p 365 = 1 365 B\sim P365(p1,p2,\dots,p365),p1=p2=,\dots,p365=\frac{1}{365} BP365(p1,p2,,p365)p1=p2=,,p365=3651,则从 P 365 P365 P365中抽样的行为可视为对学生分配到班级的模拟。那么抽样60次组成的集合就是对一个班级的模拟。因此定义一次抽样就是 s i = ( b i 1 , … , b i 60 ) s_i=(b_{i1},\dots,b_{i60}) si=(bi1,,bi60)
  2. 重复第一步N次,N取一个足够大的数,这里暂且取N为10000。
  3. s i g n ( s i ) = 1 sign(s_i)=1 sign(si)=1表示第i个样本中任意两个数都不相等, s i g n ( s i ) = 0 sign(s_i)=0 sign(si)=0表示只要有两个数相等。则有: P ( 没 有 人 的 生 日 在 同 一 天 ) ≈ 1 N ∑ i = 1 N s u m ( s i g n ( s i ) ) P(没有人的生日在同一天)\approx\frac{1}{N}\sum _{i=1}^Nsum(sign(s_i)) P()N1i=1Nsum(sign(si))
prob.one <- function(n, N){
    samples <- trunc(runif(n*N,1,366))
    samples[samples == 366] <- 365
    birdays <- matrix(samples,ncol = n)
    onedayrate <- apply(birdays,1,function(x){return(n - length(unique(x)))})
    nonday <- sum(onedayrate == 0)
    par(mfrow = c(1,2))
    hist(onedayrate, breaks = 10, xlab = '', main = "生日在同一天的人数",col = "pink")
    pie(table(as.integer(onedayrate != 0)), main = paste("没有人同一天的概率:", nonday/N),
        labels = c('无重叠', '有重叠'),col = c('orangered', 'cornflowerblue'), border = NA)
}
prob.one(60, 10000)

在这里插入图片描述

4.马尔科夫链

4.1定义

4.1.1 马尔科夫性

对于随机过程,由时刻 t 0 t_0 t0系统或过程所处状态,可以决定系统或过程在时刻 t &gt; t 0 t&gt;t_0 t>t0所处状态,而无需借助 t 0 t_0 t0以前系统或过程所处状态。即,在已知“现在”的条件下对,其“将来”不依赖于过去。
对于随机过程 { X ( t ) , t ∈ T } \{X(t),t\in T\} {X(t),tT},有:
P { X ( t n ) ≤ x n ∣ , X ( t 1 ) = x 1 , X ( t 2 ) = x 2 , … , X ( t ( n − 1 ) ) = x ( n − 1 ) } = P { X ( t n ) ≤ x n ∣ X ( t ( n − 1 ) ) = x ( n − 1 ) } , x n ∈ R P\{X(t_n)\le x_n|,X(t_1)=x_1,X(t_2)=x_2,\dots,X(t_{(n-1)})=x_{(n-1)}\} \\ =P\{X(t_n)\le x_n|X(t_{(n-1)})=x_{(n-1)}\},x_n\in \mathbb{R} P{X(tn)xn,X(t1)=x1,X(t2)=x2,,X(t(n1))=x(n1)}=P{X(tn)xnX(t(n1))=x(n1)},xnR

  • a 具有马尔科夫性的随机过程为马尔科夫过程
  • b 时间和状态都是离散的马尔科夫过程为马尔科夫链也作马氏链。

4.1.2 转移概率矩阵

定义状态转移概率如下:
P i j ( m , m + n ) = P { X m + n = a j ∣ X m = a i } ∑ j = i + ∞ P i j ( m , m + n ) = 1 , i = 1 , 2 , … P_{ij}(m, m + n)=P\{X_{m+n}=a_j|X_{m}=a_i\}\\ \sum_{j=i}^{+\infty}P_{ij}(m,m+n)=1,i=1,2,\dots Pij(m,m+n)=P{Xm+n=ajXm=ai}j=i+Pij(m,m+n)=1,i=1,2,

由状态转移概率组成的矩阵称为转移概率矩阵 P ( m , m + n ) P(m,m+n) P(m,m+n)。当 P i j ( m , m + n ) P_{ij}(m, m + n) Pij(m,m+n)只与 i , j , n i,j,n i,j,n有关时,又可记为 P i j ( n ) P_{ij}(n) Pij(n),此时称此转移概率具有平稳性,并且称链具有齐次性 P ( n ) P(n) P(n)则称为 n n n步转移概率矩阵。

4.2性质

4.2.1 C-K方程

P ( u + v ) = P ( u ) P ( v ) P(u + v) = P(u)P(v) P(u+v)=P(u)P(v)
由此推出:
P ( n ) = P ( 1 ) P ( n − 1 ) = P ( 1 ) P ( 1 ) P ( n − 2 ) = ⋯ = P ( 1 ) n P(n) = P(1)P(n-1)=P(1)P(1)P(n-2)=\dots=P(1)^n P(n)=P(1)P(n1)=P(1)P(1)P(n2)==P(1)n
因此对于齐次马氏链,任意步长的转移概率矩阵由1阶转移概率矩阵唯一确定。

4.2.2 遍历性

若对于 P i j ( n ) P_{ij}(n) Pij(n)有:
lim ⁡ n → + ∞ P i j ( n ) = π j , 不 依 赖 于 i \lim_{n\to+\infty}P_{ij}(n)=\pi_j, 不依赖于i n+limPij(n)=πj,i
则称链有便利性,又若 ∑ j π j = 1 \sum_j\pi_j=1 jπj=1,则称 π = ( π 1 , π 2 , … &ThinSpace; ) \pi=(\pi_1, \pi_2, \dots) π=(π1,π2,)为链的极限分布。

定理 对于其次马氏链,状态空间为 I ∈ a 1 , … , a N I\in{a_1,\dots,a_N} Ia1,,aN,如果存在正整数 m m m,对任意的 a i , a j a_i,a_j ai,aj
P i j ( m ) &gt; 0 , i , j = 1 , 2 , … , N P_{ij}(m)&gt;0, i,j=1,2,\dots,N Pij(m)>0,i,j=1,2,,N
则链具有遍历性,且具有极限分布 π = ( π 1 , π 2 , … &ThinSpace; ) \pi=(\pi_1, \pi_2, \dots) π=(π1,π2,)。且满足: π \pi π π P = P \pi P = P πP=P的唯一非负解。

4.3示例

假设媳妇儿的心情大致可分为三种:平静、高兴、愤怒,并且每隔15分钟就会发生一次状态转移,同时下一时刻心情的变化只与上一刻的心情有关。那么根据定义,一段时间内她的心情状态就构成一条马尔科夫链。
假定这几种心情状态的一步转移概率矩阵构成如下。希望知道每天下班回家,见着她时最有可能处于那种心,好提前做好心理准备。

states_name <- c('平静', '高兴', '愤怒')
P_s1 <- matrix(
  c(0.2, 0.3, 0.5, 0.1, 0.6, 0.3, 0.4, 0.2, 0.4), ncol = 3, byrow = TRUE, 
  dimnames = list(states_name, states_name)
  )
kable(P_s1)
平静高兴愤怒
平静0.20.30.5
高兴0.10.60.3
愤怒0.40.20.4

随意给定初值条件进行概率推演,结果如下。

> P_s1 <- matrix(
+   c(0.2, 0.3, 0.5, 0.1, 0.6, 0.3, 0.4, 0.2, 0.4), ncol = 3, byrow = TRUE, 
+   dimnames = list(states_name, states_name)
+   )
> kable(P_s1)
> print(PI)
           平静      高兴      愤怒
 [1,] 0.7000000 0.2000000 0.1000000
 [2,] 0.2000000 0.3500000 0.4500000
 [3,] 0.2550000 0.3600000 0.3850000
 [4,] 0.2410000 0.3695000 0.3895000
 [5,] 0.2409500 0.3719000 0.3871500
 [6,] 0.2402400 0.3728550 0.3869050
 [7,] 0.2400955 0.3731660 0.3867385
 [8,] 0.2400311 0.3732760 0.3866930
 [9,] 0.2400110 0.3733135 0.3866755
[10,] 0.2400038 0.3733265 0.3866698

得知其平稳分布为 π = { π 平 静 = 0.240 , π 高 兴 = 0.373 , π 愤 怒 = 0.387 } \pi=\{\pi_{平静}=0.240, \pi_{高兴}=0.373, \pi_{愤怒}=0.387\} π={π=0.240,π=0.373,π=0.387},从而发现有0.613的概率不会挨批。于是每天携带一块秒表,进门前按下并读取毫秒数。如果数值小于0.613放心大胆进门,否则等15分钟再按一次。

5.MCMC

5.1 MCMC采样

5.1.1原理

(1)细致平稳条件

定理 如果非周期马氏链的转移矩阵 P P P和概率分布 π ( x ) \pi(x) π(x)满足
π ( i ) P i j = π ( j ) P j i , 对 任 意 的 i , j \pi(i) P_{ij} = \pi(j) P_{ji},对任意的i,j π(i)Pij=π(j)Pjii,j
π ( x ) \pi(x) π(x)为该马氏链的平稳分布。
π ( x ) \pi(x) π(x)为需要抽样的目标分布,则如果能够得到一个转移概率矩阵 P P P使得细致平稳条件成立,那么从一个简单分布中获取随机样本(这里简单分布指容易通过计算机程序进行直接抽样的分布,采用什么样的简单分布,视场景而定),经过 P P P完成若干次转移变换,则最终会到达目标分布从而完成从 π ( x ) \pi(x) π(x)中进行抽样。因而只要能够确定 P P P,就能够实现抽样。

(2)利用细致平稳条件

既然知道了细致平稳条件这一硬性标杆,即便没有条件,那就创造条件。
假设随机给定一个形式上合规的矩阵 Q Q Q作为转移矩阵,则细致平稳条件一般无法满足:
p ( i ) q ( i , j ) ≠ p ( j ) q ( j , i ) p(i)q(i,j)\neq p(j)q(j,i) p(i)q(i,j)̸=p(j)q(j,i)
此时构造如下两个新变量,分别乘以等式两端。
α ( i , j ) = p j q ( j , i ) , α ( j , i ) = p i q ( i , j ) \alpha(i,j)=p_jq(j,i), \alpha(j,i)=p_iq(i,j) α(i,j)=pjq(j,i),α(j,i)=piq(i,j)
由于:
p ( i ) q ( i , j ) p ( j ) q ( j , i ) = p ( j ) q ( j , i ) p ( i ) q ( i , j ) p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)p(i)q(i,j) p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)p(i)q(i,j)
所以有:
p ( i ) q ( i , j ) α ( i j ) = p ( j ) q ( j , i ) α ( j , i ) p(i)q(i,j)\alpha{(ij)}=p(j)q(j,i)\alpha{(j,i)} p(i)q(i,j)α(ij)=p(j)q(j,i)α(j,i)

此时令:
Q ′ ( i , j ) = q ( i , j ) α ( i , j ) , Q ′ ( j , i ) = q ( j , i ) α ( j , i ) Q^\prime(i,j) = q(i,j)\alpha(i,j), Q^\prime(j,i) = q(j,i)\alpha(j,i) Q(i,j)=q(i,j)α(i,j),Q(j,i)=q(j,i)α(j,i)
可知,在引入 Q ′ Q^\prime Q的条件下,下式成立,也即细致平稳条件满足。满足了细致平稳条件,就可进行抽样了!
p ( i ) Q ′ ( i , j ) = p ( j ) Q ′ ( j , i ) p(i)Q^\prime(i,j)=p(j)Q^\prime(j,i) p(i)Q(i,j)=p(j)Q(j,i)

(3)理解

要理解 Q − &gt; Q ′ Q -&gt; Q^\prime Q>Q的过程是如何实现的,就是要理解 α ( i , j ) \alpha(i,j) α(i,j)在前后两个马氏链的变换上所起到的作用。

假设有一枚不均质的硬币, P ( X = 正 面 ) = 0.6 P(X=正面)=0.6 P(X=)=0.6,那么如何模拟一次抛掷的动作呢?如下图所示,问题等价于在[0,1]区间内,在0.6的位置将整个区间分割为[0,0.6],(0.6,1],并向其中随机撒点,任意一次撒点后点落入左侧区间,则表示正面向上,落入右侧区间则表示反面向上。随机撒点的动作,通过均匀分布抽样实现。
在这里插入图片描述
在这里 α ( i , j ) \alpha(i,j) α(i,j),实际上就是扮演了硬币的角色,它的作用就是在保持整个抽样过程随机性的前提下,按概率实现马氏链的更新。

5.1.2算法

假设Q表示一步状态转移矩阵(对应的在连续的情况下,用D表示概率密度函数)。

  • a 用X表示由MCMC过程产生的状态向量, Q 0 Q_0 Q0表示状态转移矩阵( D 0 D_0 D0表示抽样分布)。初始化 X 0 = x 0 X_0=x_0 X0=x0,其中 x 0 x_0 x0是从状态集(分布)中获取的随机样本。
  • b 对 t = 0 , 1 , 2 , ⋯ &ThinSpace; , n t = 0, 1, 2, \cdots,n t=0,1,2,,n重复如下步骤进行采样:
    • b-1 第 t t t时刻有 X t = x t X_t=x_t Xt=xt, 采样 y   q ( x ∣ x t ) y~q(x|x_t) y q(xxt)(此时状态转移矩阵为 Q t = q ( x ∣ x t ) Q_t=q(x|x_t) Qt=q(xxt))。
    • b-2 从 U ( 0 , 1 ) U(0,1) U(0,1)中抽取一个样本点 u u u
    • b-3 如果 u &lt; α ( x t , y ) = p ( y ) ∗ q ( x t ∣ y ) u&lt;\alpha(x_t, y)=p(y)*q(x_t|y) u<α(xt,y)=p(y)q(xty)则接受转移 X t + 1 = y X_{t+1}=y Xt+1=y
    • b-4 否则拒绝转移, X t + 1 = x t X_{t+1}=x_t Xt+1=xt, Q t + 1 = Q t Q_{t+1} = Q_t Qt+1=Qt

5.2 M-H方法

5.2.1原理

由于 α ( i , j ) = p j q ( j , i ) &lt; 1 \alpha(i,j)=p_{j}q(j,i) &lt; 1 α(i,j)=pjq(j,i)<1,通常是一个比较小的数字,因此在一次采样中很容易拒绝跳转。从而导致采样的时间成本、计算成本很高。M-H(Metropolis-Hastings)采样,通过放大跳转率 α ( i , j ) \alpha(i,j) α(i,j)提高了跳转概率,缩短了采样过程。
对下式两边同时除以 p ( i ) q ( i , j ) p(i)q(i,j) p(i)q(i,j)
p ( i ) q ( i , j ) p ( j ) q ( j , i ) = p ( j ) q ( j , i ) p ( i ) q ( i , j ) p ( i ) q ( i , j ) p ( j ) q ( j , i ) p ( i ) q ( i , j ) = p ( j ) q ( j , i ) p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)p(i)q(i,j) \\ p(i)q(i,j)\frac{p(j)q(j,i)}{p(i)q(i,j)}=p(j)q(j,i) p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)p(i)q(i,j)p(i)q(i,j)p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)
此时有
α ( i , j ) = p ( j ) q ( j , i ) p ( i ) q ( i , j ) , α ( j , i ) = 1 \alpha(i,j)=\frac{p(j)q(j,i)}{p(i)q(i,j)},\alpha(j,i)=1 α(i,j)=p(i)q(i,j)p(j)q(j,i),α(j,i)=1

此时,如果 α ( i , j ) = p ( j ) q ( j , i ) p ( i ) q ( i , j ) &lt; 1 \alpha(i,j) = \frac{p(j)q(j,i)}{p(i)q(i,j)} &lt; 1 α(i,j)=p(i)q(i,j)p(j)q(j,i)<1 α ( i , j ) \alpha(i,j) α(i,j)按照 α ( j , i ) \alpha(j,i) α(j,i)放大到1的比例等比例放大。但如果 p ( j ) q ( j , i ) p ( i ) q ( i , j ) &gt; 1 \frac{p(j)q(j,i)}{p(i)q(i,j)} &gt; 1 p(i)q(i,j)p(j)q(j,i)>1就不行了,由于概率是不可能大于1的。那么此时就反过来,同除以 p ( j ) q ( j , i ) p(j)q(j,i) p(j)q(j,i).

p ( i ) q ( i , j ) p ( j ) q ( j , i ) = p ( j ) q ( j , i ) p ( i ) q ( i , j ) p ( i ) q ( i , j ) = p ( j ) q ( j , i ) p ( i ) q ( i , j ) p ( j ) q ( j , i ) p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)p(i)q(i,j) \\ p(i)q(i,j)=p(j)q(j,i)\frac{p(i)q(i,j)}{p(j)q(j,i)} p(i)q(i,j)p(j)q(j,i)=p(j)q(j,i)p(i)q(i,j)p(i)q(i,j)=p(j)q(j,i)p(j)q(j,i)p(i)q(i,j)
此时有
α ( i , j ) = 1 , α ( j , i ) = p ( i ) q ( i , j ) p ( j ) q ( j , i ) \alpha(i,j) = 1,\alpha(j,i)=\frac{p(i)q(i,j)}{p(j)q(j,i)} α(i,j)=1,α(j,i)=p(j)q(j,i)p(i)q(i,j)
当然为了跳转,需要关心的只有 α ( i , j ) \alpha(i,j) α(i,j),根据以上推到新的 α ( i , j ) \alpha(i,j) α(i,j)可定义为:
α ( i , j ) = m i n ( p ( j ) q ( j , i ) p ( i ) q ( i , j ) , 1 ) \alpha(i,j)=min(\frac{p(j)q(j,i)}{p(i)q(i,j)},1) α(i,j)=min(p(i)q(i,j)p(j)q(j,i),1)

对于新的 α \alpha α在取到1的情况下能实现链的满概率跳转,否则以放大 1 p ( i ) q ( i , j ) \frac{1}{p(i)q(i,j)} p(i)q(i,j)1倍的概率进行跳转,这就是M-H方法对MCMC方法的改进。

5.2.2算法

其它不变,这里只是改变了跳转率的计算方法。

  • a 用X表示由MCMC过程产生的状态向量, Q 0 Q_0 Q0表示状态转移矩阵( D 0 D_0 D0表示抽样分布)。初始化 X 0 = x 0 X_0=x_0 X0=x0,其中 x 0 x_0 x0是从状态集(分布)中获取的随机样本。
  • b 对 t = 0 , 1 , 2 , ⋯ &ThinSpace; , n t = 0, 1, 2, \cdots,n t=0,1,2,,n重复如下步骤进行采样:
    • b-1 第 t t t时刻有 X t = x t X_t=x_t Xt=xt, 采样 y   q ( x ∣ x t ) y~q(x|x_t) y q(xxt)(此时状态转移矩阵为 Q t = q ( x ∣ x t ) Q_t=q(x|x_t) Qt=q(xxt))。
    • b-2 从 U ( 0 , 1 ) U(0,1) U(0,1)中抽取一个样本点 u u u
    • b-3 如果$u<\alpha(x_t, y)=min(\frac{p(j)q(j,i)}{p(i)q(i,j)},1)$则接受转移$X_{t+1}=y$
    • b-4 否则拒绝转移, X t + 1 = x t X_{t+1}=x_t Xt+1=xt, Q t + 1 = Q t Q_{t+1} = Q_t Qt+1=Qt

5.3 Gibbs方法

5.3.1原理

(1)M-H方法的局限

M-H方法,虽然实现了跳转率的放大,但依然不能保证100%的跳转,这就意味着总归还是要浪费不少样本,即使已经到达稳态,也还是经常要抛弃样本。这也极大的限制了M-H算法的应用范围。如果有一种方法,能够保证每次跳转都以100%的概率被接受,那就更完美的解决了这一问题。

(2)轮换采样

对于定义于二维空间中的马氏链,考虑如下等式:
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)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(x1,y1)p(y2x1)=p(x1)p(y1x1)p(y2x1)p(x1,y2)p(y1x1)=p(x1)p(y2x1)p(y1x1)
两式右边相等,因此有:
p ( x 1 , y 1 ) p ( y 2 ∣ x 1 ) = p ( x 1 , y 2 ) 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) p(x1,y1)p(y2x1)=p(x1,y2)p(y1x1)
这个等式完全满足细致平稳条件,可以实现点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)到点 ( x 1 , y 2 ) (x_1,y_2) (x1,y2)以100%的跳转率进行转换。同时可以看到转换后的两点在平行于 y y y轴的同一条直线上。同理可知固定 y y y轴而在 x x x轴的方向上进行采样,也同样满足细致平稳条件。因此对于二维空间中的马氏链,如下图所示,只要在两个轴的方向上进行采样就不存在拒绝跳转的问题。同理,将这一性质推广到 N N N维空间也是成立的。
在这里插入图片描述

5.3.2算法

以二元分布 D ( x , y ) D(x,y) D(x,y)为例

  • a 初始化 X 0 = x 0 , Y 0 = y 0 X_0=x_0,Y_0=y_0 X0=x0,Y0=y0
  • b 对 t = 0 , 1 , 2 , ⋯ &ThinSpace; , n t = 0, 1, 2, \cdots,n t=0,1,2,,n进行坐标轮换采样
    • b-1 y t + 1 ∼ p ( y ∣ x t ) y_{t+1}\sim p(y|x_t) yt+1p(yxt)
    • b-2 x t + 1 ∼ p ( x ∣ y t + 1 ) x_{t+1}\sim p(x|y_{t+1}) xt+1p(xyt+1)

6.示例

6.1 M-H抽样

问题

使用M-H方法实现从混合正态分布中抽样。

求解

SomeDist <- function(x){
  if (x < 6) {
    res <- dnorm(x, mean = 6, sd = 2)
  } else {
    res <- dnorm(x, mean = 6, sd = 6)
  }
  return(res)
}
 
n1 = 15000  # burn in
n2 = 25000
samples <- rep(0, n1 + n2)
for (i in 1:(n1 + n2 - 1)) {
  temp <- rnorm(1,mean = samples[i], sd = 4)
  alpha <- min(1, SomeDist(temp)/SomeDist(samples[i]))
  if (runif(1, 0, 1) < alpha) {
    samples[i + 1] <- temp
  } else {
    samples[i + 1] <- samples[i]
  }
}

correct_samples <- samples[(n1 + 1):n2]
library(ggplot2)
sampledata <- data.frame(x = correct_samples)
norm1 <- data.frame(x = correct_samples, y = dnorm(correct_samples, 6, 2))
norm2 <- data.frame(x = correct_samples, y = dnorm(correct_samples, 6, 6))
ggplot() +
  geom_histogram(
    data = sampledata, 
    aes(x, y = ..density.., fill = ..density..), binwidth = 0.2
    ) +
  geom_point(data = norm1, aes(x = x, y = y), col = 'orangered') +
  geom_point(data = norm2, aes(x = x, y = y), col = 'forestgreen') +
  scale_fill_continuous_yk(isreverse = T)

在这里插入图片描述

6.2 Gibbs抽样

问题

使用Gibbs方法从二元正态分布 N ( μ 1 , μ 2 , σ 1 2 , σ 2 2 , ρ ) N(\mu_1, \mu_2, \sigma_1^2, \sigma_2^2,\rho) N(μ1,μ2,σ12,σ22,ρ)中抽样

求解

按条件有随机变量 X 1 ∼ N ( μ 1 , σ 1 2 ) X_1\sim N(\mu_1,\sigma_1^2) X1N(μ1,σ12), X 2 ∼ N ( μ 2 , σ 2 2 ) X_2\sim N(\mu_2,\sigma_2^2) X2N(μ2,σ22)服从正态分布。因此 X 1 ∣ X 2 X_1|X_2 X1X2以及 X 2 ∣ X 1 X_2|X_1 X2X1服从正态分布,且 X 1 ∣ X 2 X_1|X_2 X1X2的期望和方差为:

E [ X 1 ∣ X 2 = x 2 ] = μ 1 + ρ σ 1 σ 2 ( x 2 − μ 2 ) V a r [ X 1 ∣ X 2 = x 2 ] = ( 1 − ρ 2 ) σ 1 2 E[X_1|X_2=x_2]=\mu_1 + \rho\frac{\sigma_1}{\sigma_2}(x_2 - \mu_2)\\ Var[X_1|X_2=x_2]=(1 - \rho^2)\sigma_1^2 E[X1X2=x2]=μ1+ρσ2σ1(x2μ2)Var[X1X2=x2]=(1ρ2)σ12

X 2 ∣ X 1 X_2|X_1 X2X1也可类比。因此条件概率密度为:

f ( x 1 ∣ x 2 ) ∼ N ( μ 1 + ρ σ 1 σ 2 ( x 2 − μ 2 ) , ( 1 − ρ 2 ) σ 1 2 ) f ( x 2 ∣ x 1 ) ∼ N ( μ 2 + ρ σ 2 σ 2 ( x 1 − μ 1 ) , ( 1 − ρ 2 ) σ 2 2 ) f(x_1|x_2)\sim N(\mu_1 + \rho\frac{\sigma_1}{\sigma_2}(x_2 - \mu_2), (1 - \rho^2)\sigma_1^2)\\ f(x_2|x_1)\sim N(\mu_2 + \rho\frac{\sigma_2}{\sigma_2}(x_1 - \mu_1), (1 - \rho^2)\sigma_2^2) f(x1x2)N(μ1+ρσ2σ1(x2μ2),(1ρ2)σ12)f(x2x1)N(μ2+ρσ2σ2(x1μ1),(1ρ2)σ22)

抽样过程:

N <- 5000
N.burn <- 1000
X <- matrix(0, N, 2)
rho <- -0.6
mu1 <- 2; mu2 <- 10
sigma1 <- 1; sigma2 <- 2
s1 <- sqrt(1 - rho^2)*sigma1
s2 <- sqrt(1 - rho^2)*sigma2
X[1, ] <- c(mu1, mu2) # 用均值点作为抽样起点
for (i in 2:N) {
  if (i %% 2 == 1) {
    # 奇数步固定x2对x1采样
    x2 <- X[i - 1, 2]
    m1 <- mu1 + rho*(x2 - mu2)*sigma1/sigma2
    X[i, 1] <- rnorm(1, m1, s1)
    X[i, 2] <- x2
  } else {
    # 偶数步固定x1对x2采样
    x1 <- X[i - 1, 1]
    m2 <- mu2 + rho*(x1 - mu1)*sigma2/sigma1
    X[i, 1] <- x1
    X[i, 2] <- rnorm(1, m2, s2)
  }
}
X.samples <- X[(N.burn + 1):N,]

采样轨迹

library(ggplot2)
X.samples.df <- as.data.frame(X.samples)
names(X.samples.df) <- c('X1', 'X2')
ggplot() + geom_path(data = X.samples.df[1:500,], aes(x = X1, y = X2))

在这里插入图片描述

由于坐标轮换采样会导致相邻两个样本之间是条件独立而非完全独立的,但不相邻的样本之间是完全独立的。因此为了保证采样的随机性,仅选取奇数下标的样本作为最终的抽样结果。

> X.samples.real <- X.samples[seq(1, nrow(X.samples), by = 2),]

均值

> colMeans(X.samples.real)
[1]  1.99791 10.00917

方差

> cov(X.samples.real)
          [,1]      [,2]
[1,]  1.006575 -1.270476
[2,] -1.270476  4.290423

样本分布
在这里插入图片描述
以上过程完演示了完整的Gibbs抽样,由于相邻样本间条件独立性的问题,更快的采样方式是在每次循环中采样完一个坐标以后,立即采样另一个坐标并将采样得到的两个坐标的新值合并为一个样本点,相当于从A点出发采样两次得到B和C,但是只存储C点(如下图所示)。

在这里插入图片描述
改进 直接采样

N <- 5000
N.burn <- 1000
X <- matrix(0, N, 2)
rho <- -0.6
mu1 <- 2
mu2 <- 10
sigma1 <- 1
sigma2 <- 2
s1 <- sqrt(1 - rho^2)*sigma1
s2 <- sqrt(1 - rho^2)*sigma2
X[1, ] <- c(mu1, mu2) # 用均值点作为抽样起点

for (i in 2:N) {
  # 先固定x2对x1采样
  x2 <- X[i - 1, 2]
  m1 <- mu1 + rho*(x2 - mu2)*sigma1/sigma2
  X[i, 1] <- rnorm(1, m1, s1)
  # 再固定x1对x2采样
  x1 <- X[i, 1]
  m2 <- mu2 + rho*(x1 - mu1)*sigma2/sigma1
  X[i, 2] <- rnorm(1, m2, s2)
}

X.samples <- X[(N.burn + 1):N,]
<think>好的,我需要帮助用户了解MCMC算法的概念和编程实现。首先,我得回忆一下MCMC的基础知识,确保自己理解正确。MCMC是马尔可夫链蒙特卡罗的缩写,主要用于从复杂概率分布中抽样,特别是在高维空间或者解析解难以求得的情况下。 接下来,我需要整理MCMC的核心概念。比如,马尔可夫链的平稳分布,这是保证抽样结果正确性的关键。还有Metropolis-Hastings算法,这是最经典的MCMC方法之一。另外,Gibbs抽样也是常用的一种方法,适用于条件分布容易采样的情形。 然后,编程实现部分。用户可能希望看到具体的代码示例,Python是比较常用的语言,所以我应该用Python来写。Metropolis-Hastings算法需要先定义目标分布,比如正态分布,然后选择提议分布,比如均匀分布或者正态分布。代码的结构包括初始化参数、循环迭代、接受或拒绝样本等步骤。需要注意的是调整步长参数,以确保合适的接受率,通常推荐在20%-50%之间。 验证算法的正确性也很重要。可以通过绘制抽样结果的直方图,并目标分布的概率密度函数对比,观察是否匹配。此外,可能需要提到收敛诊断的方法,比如Gelman-Rubin统计量,但代码示例中可以简单用图形对比来展示。 用户可能的问题包括如何选择提议分布,如何处理收敛问题,MCMC的应用场景,以及不同算法之间的比较,比如MH和Gibbs。这些可以作为相关问题列在最后,帮助用户进一步探索。 需要检查LaTeX格式是否正确,所有数学公式都用$...$或$$...$$包裹。例如,目标分布的定义,接受概率的计算等。确保代码块语法正确,注释清晰,方便用户理解。 最后,确保回答结构清晰,分点讲解概念和实现步骤,代码示例后附上相关问题和引用。引用部分要根据提供的参考信息添加,但用户提供的引用似乎MCMC无关,可能需要调整或者确认是否有误。这里可能用户提供的引用有误,但按照要求还是在末尾加上引用标识。</think>### MCMC算法基础实现 马尔可夫链蒙特卡罗(MCMC)是一种通过构建马尔可夫链从复杂概率分布中抽样的方法[^1]。其核心思想是通过迭代生成样本,使得马尔可夫链的平稳分布等于目标分布。常见算法包括**Metropolis-Hastings**和**Gibbs抽样**。 #### 关键步骤 1. **目标分布**:定义需抽样的分布$p(x)$。 2. **提议分布**:选择过渡分布$q(x'|x)$生成候选样本。 3. **接受概率**:计算候选样本的接受概率$\alpha = \min\left(1, \frac{p(x')q(x|x')}{p(x)q(x'|x)}\right)$。 4. **迭代更新**:以概率$\alpha$接受候选样本,否则保留当前样本。 #### Python实现示例(Metropolis-Hastings) 以下代码从正态分布$N(0,1)$中抽样: ```python import numpy as np import matplotlib.pyplot as plt def target_distribution(x): return np.exp(-x**2 / 2) / np.sqrt(2 * np.pi) # 标准正态分布 def metropolis_hastings(n_samples, initial=0, step_size=1): samples = [initial] current = initial for _ in range(n_samples): proposal = current + np.random.normal(0, step_size) accept_ratio = target_distribution(proposal) / target_distribution(current) if np.random.rand() < accept_ratio: current = proposal samples.append(current) return samples # 生成样本并验证 samples = metropolis_hastings(10000) plt.hist(samples, bins=50, density=True) x = np.linspace(-4, 4, 100) plt.plot(x, target_distribution(x), 'r') plt.show() ``` **代码说明**: - `step_size`控制提议分布的步长,影响接受率[^2]。 - 直方图应红色曲线(目标分布)吻合,验证算法正确性。 #### 优化注意事项 - **步长调整**:接受率通常在20%-50%之间最优。 - **预烧期**:丢弃前$N$个样本以避免初始值影响。 - **相关性**:可通过稀疏采样(如每隔10个样本取一次)降低样本相关性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值