MCMC算法

参考以下:

1. https://blog.youkuaiyun.com/qq_23142123/article/details/71747074?locationNum=13&fps=1  (看了后略懂)

2. https://blog.youkuaiyun.com/lanchunhui/article/details/50451620 

3. https://blog.youkuaiyun.com/lanchunhui/article/details/50452515

### MCMC算法原理 MCMC(Markov Chain Monte Carlo)是一种基于马尔可夫链的蒙特卡罗方法,用于从复杂的概率分布中抽取样本。它通过构建一个具有特定平稳分布的目标马尔可夫链来实现这一目的[^2]。 #### 平稳分布与细致平衡条件 为了使马尔可夫链达到目标分布 \( \pi(x) \),需要满足细致平衡条件: \[ p(y|x)\pi(x) = p(x|y)\pi(y), \] 其中 \( p(y|x) \) 是从状态 \( x \) 转移到状态 \( y \) 的转移概率[^4]。如果细致平衡条件成立,则可以证明 \( \pi(x) \) 就是该马尔可夫链的平稳分布。 --- ### 常见的MCMC算法 #### 1. Metropolis-Hastings算法 Metropolis-Hastings算法是最常用的MCMC方法之一。它的核心思想是从当前状态出发,按照某种提议分布生成候选状态,并根据接受率决定是否转移到新状态[^1]。 ##### 接受率公式 假设当前状态为 \( x^{(t)} \),提议分布为 \( q(x'|x) \),则新的状态 \( x' \) 的接受率为: \[ A(x', x) = \min\left(1, \frac{\pi(x')q(x|x')}{\pi(x)q(x'|x)}\right). \] 如果随机数小于接受率,则接受新状态;否则保持原状态不变。 --- #### 2. Gibbs采样 Gibbs采样适用于多维变量的情况。其基本思路是对每个维度依次更新,在给定其他维度的情况下,从条件分布中抽样[^1]。 设联合分布为 \( \pi(x_1, x_2, ..., x_n) \),则第 \( i \)-维的更新规则为: \[ x_i^{(t+1)} \sim \pi(x_i | x_1^{(t+1)}, ..., x_{i-1}^{(t+1)}, x_{i+1}^{(t)}, ..., x_n^{(t)}). \] 这种方法无需显式计算接受率,因此效率较高。 --- ### Python实现示例 以下是使用Python实现简单的Metropolis-Hastings算法: ```python import numpy as np def metropolis_hastings(target_distribution, proposal_function, initial_state, iterations): """ 实现Metropolis-Hastings算法 参数: target_distribution: 目标分布的概率密度函数 proposal_function: 提议分布函数 initial_state: 初始状态 iterations: 迭代次数 返回: samples: 抽取的样本列表 """ current_state = initial_state samples = [current_state] for _ in range(iterations): proposed_state = proposal_function(current_state) acceptance_ratio = ( target_distribution(proposed_state) * proposal_function(proposed_state, current_state) / (target_distribution(current_state) * proposal_function(current_state, proposed_state)) ) if np.random.rand() < min(1, acceptance_ratio): current_state = proposed_state samples.append(current_state) return samples # 定义目标分布和提议分布 def gaussian_target(x): """正态分布作为目标分布""" mean, std = 0, 1 return np.exp(-((x - mean)**2 / (2 * std**2))) / (std * np.sqrt(2 * np.pi)) def random_walk_proposal(current_state, scale=1): """随机游走提议分布""" return np.random.normal(loc=current_state, scale=scale) # 执行MH算法 initial_value = 0 iterations = 10000 samples = metropolis_hastings(gaussian_target, random_walk_proposal, initial_value, iterations) print(samples[:10]) # 输出前10个样本 ``` --- ### 总结 MCMC算法的核心在于构造合适的马尔可夫链并使其收敛到目标分布。具体实现时可以选择不同的变体,如Metropolis-Hastings或Gibbs采样,取决于问题的具体需求和复杂度[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值