MCMC和Gibbs Sampling

很多常见的概率分布,都可以用Uniform(0,1)Uniform(0, 1)Uniform(0,1)的样本生成,比如正态分布:
在这里插入图片描述
但是,如果某个分布过于复杂,样本的生成就很困难了。于是我们需要更加复杂的随机模拟方法生成样本。MCMC采样和gibbs sampling就是常用的一种。介绍这两个算法前,需要有一些马氏链的基本知识。

马尔科夫链

马尔可夫链又称离散时间马尔可夫链,为状态空间中经过从一个状态到另一个状态转换的随机过程。

该过程要求具有“无记忆”的性质:下一个状态的概率分布只能由当前状态来决定,在时间序列中前面的事件均与之无关。这种特定的 无记忆性 被称作马尔可夫性质。

用数学的方式来表达:假设状态序列为x1,x2,⋯ ,xt−1,xt,xt+1,⋯x_1,x_2,\cdots,x_{t-1},x_t,x_{t+1},\cdotsx1,x2,,xt1,xt,xt+1,,由马尔可夫链定义知,时刻t+1的状态只与时刻t的状态有关,则有:
P(xt+1∣x1,x2,⋯ )=P(xt+1∣xt) P(x_{t+1}|x_1,x_2,\cdots)=P(x_{t+1}|x_t) P(xt+1x1,x2,)=P(xt+1xt)
由于下一个状态只与当前状态有关,因此,只要求得到两个状态之间的转移概率(又称状态转移矩阵),即可得到一个马尔可夫链模型。

举个例子:
在这里插入图片描述
的状态转移矩阵为:
在这里插入图片描述
如果我们对其不断的求幂,我们会发现它会收敛:
在这里插入图片描述
关于马氏链的平稳分布我们有如下定理:
在这里插入图片描述

细致平衡条件

什么样的状态转移矩阵能够使得马氏链达到平稳分布呢?
细致平衡条件(Detailed Balance Condition):给定一个马尔可夫链,分布π\piπ和概率矩阵PPP,如果下面等式成立:
πiPij=πjPji \pi_iP_{ij}=\pi_jP_{ji} πiPij=πjPji
则称马尔可夫链具有平稳分布(Stationary Distribution)。
细致平衡条件是马氏链收敛的充分条件。

简单给出证明:
如果满足平稳分布,则根据定理0.4.2有:
πi=∑jπjPji\pi_i=\sum_j \pi_jP_{ji}πi=jπjPji
我们对等式右边进行变换:
∑jπjPji=∑jπiPji=πi∑jPji=πi\sum_j \pi_jP_{ji} = \sum_{j}\pi_i P_{ji}=\pi_i \sum_jP_{ji}=\pi_ijπjPji=jπiPji=πijPji=πi
证明成立。

MCMC

对于给定的概率分布p(x)p(x)p(x),我们希望能有便捷的方式生成它对应的随机样本。一个想法是,如果有一个马氏链的平稳分布恰恰是p(x)p(x)p(x),就可以根据任何初始状态最终收敛于平稳分布。

假设有一个状态转移矩阵是QQQ,通常情况下:
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(i)q(i,j)α(i,j)=p(j)q(j,i)α(j,i)p(i)q(i,j)\alpha(i,j)=p(j)q(j,i)\alpha(j,i)p(i)q(i,j)α(i,j)=p(j)q(j,i)α(j,i)
其中:
α(i,j)=p(j)q(j,i),α(j,i)=p(i)q(i,j)\alpha(i,j)=p(j)q(j,i),\alpha(j,i)=p(i)q(i,j)α(i,j)=p(j)q(j,i),α(j,i)=p(i)q(i,j)
此时,细致平稳分布就成立了。
我们把α(i,j)\alpha(i,j)α(i,j)称为接受率,如下图所示:
在这里插入图片描述
根据上述分析,我们就可以得到一个采样概率分布p(x)p(x)p(x)的算法:
在这里插入图片描述
但是,这个算法收敛的比较慢,因为α(i,j)\alpha(i,j)α(i,j)较小,大部分时间在原地踏步,所以我们可以针对α(i,j)\alpha(i,j)α(i,j)进行一些改进:

p(i)q(i,j)α(i,j)=p(j)q(j,i)α(j,i)p(i)q(i,j)\alpha(i,j)=p(j)q(j,i)\alpha(j,i)p(i)q(i,j)α(i,j)=p(j)q(j,i)α(j,i)而言,左右两边同时扩大N倍,等式同样成立,因此,将两数中大的那个数放大到1,会大幅提高接受度,其改进后的公式如下:
在这里插入图片描述
于是,我们得到Metropolis-Hastings算法:
在这里插入图片描述

Gibbs Sampling

对于高维的情形,由于接受率的存在,Metropolis-Hastings的算法效率仍不够高,我们希望找到一个转移矩阵QQQ使得接受率为1。那么应该怎么做呢?首先来看二维的情形:
在这里插入图片描述
假设有一个概率分布p(x,y)p(x,y)p(x,y),对于A,B两个点,我们有:
p(x1,y1)p(y2∣x1)=p(x1,y1,y2)p(x1,y2)p(y1∣x1)=p(x1,y1,y2)⇒p(x1,y1)p(y2∣x1)=p(x1,y2)p(y1∣x1)p(x_1,y_1)p(y_2|x_1)=p(x_1,y_1,y_2) \\ p(x_1,y_2)p(y_1|x_1)=p(x_1,y_1,y_2) \\ ⇒ 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,y1,y2)p(x1,y2)p(y1x1)=p(x1,y1,y2)p(x1,y1)p(y2x1)=p(x1,y2)p(y1x1)
同样的,对于具有某个相同坐标的A,C也具有相同的性质。因此,我们可以得出:如果马氏链的转移是沿着坐标轴做转移,那么满足细致平衡条件。以下是二维吉布斯采样中的马氏链转移图:
在这里插入图片描述
如果将问题扩散到高维,也很容易可以得出:
p(x⃗1,y1)p(y2∣x⃗1)=p(x⃗1,y2)p(y1∣x⃗1)p(\vec x_1,y_1)p(y_2|\vec x_1)=p(\vec x_1,y_2)p(y_1|\vec x_1)p(x1,y1)p(y2x1)=p(x1,y2)p(y1x1)
同样满足细致平衡条件。
因此我们可以得出高维的吉布斯采样的算法:
在这里插入图片描述

参考

LDA 数学八卦

### Gibbs采样算法的原理与实现 Gibbs采样是一种基于马尔可夫链蒙特卡洛(MCMC)方法的统计采样技术,用于从复杂的多维分布中生成样本。它的核心思想是通过迭代地从条件分布中采样来逼近目标联合分布[^2]。 在Gibbs采样的过程中,假设有一个多维随机变量 \( X = (X_1, X_2, \ldots, X_n) \),其联合分布为 \( P(X_1, X_2, \ldots, X_n) \)。如果直接从该联合分布中采样较为困难,则可以通过以下步骤实现: 1. 初始化所有变量 \( X^{(0)} = (X_1^{(0)}, X_2^{(0)}, \ldots, X_n^{(0)}) \)。 2. 对于每个变量 \( X_i \),在固定其他变量值的情况下,从条件分布 \( P(X_i | X_1, X_2, \ldots, X_{i-1}, X_{i+1}, \ldots, X_n) \) 中采样。 3. 重复上述过程,直到马尔可夫链收敛到平稳分布。 以下是Gibbs采样的Python实现示例,假设我们要从二维高斯分布中采样: ```python import numpy as np import matplotlib.pyplot as plt def gibbs_sampling(num_samples, initial_values, conditional_distributions): samples = [initial_values] current_sample = initial_values.copy() for _ in range(num_samples): for i, conditional_distribution in enumerate(conditional_distributions): # 从条件分布中采样 current_sample[i] = conditional_distribution(current_sample) samples.append(current_sample.copy()) return np.array(samples) # 定义条件分布函数 def conditional_x_given_y(y): return np.random.normal(loc=0.5 + y, scale=1.0) def conditional_y_given_x(x): return np.random.normal(loc=1.0 + x, scale=1.5) # 初始化参数 num_samples = 1000 initial_values = [0, 0] conditional_distributions = [conditional_x_given_y, conditional_y_given_x] # 运行Gibbs采样 samples = gibbs_sampling(num_samples, initial_values, conditional_distributions) # 可视化结果 plt.scatter(samples[:, 0], samples[:, 1], alpha=0.5) plt.title("Gibbs Sampling Results") plt.xlabel("X") plt.ylabel("Y") plt.show() ``` 上述代码展示了如何从一个二维高斯分布中进行Gibbs采样,并将结果可视化。需要注意的是,Gibbs采样的收敛性依赖于马尔可夫链的性质,例如不可约性遍历性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值