MCMC算法—MH算法的Python实现(一)

本文探讨了MCMC中的Metropolis-Hastings(MH)算法在处理离散数据概率分布时的Python实现。通过四组实验,对比不同输入分布p对样本分布的影响,发现当状态转移矩阵的每一行与输入分布相同时,算法能获得较高精度。结论强调了设计状态转移矩阵的重要性,并指出该方法适用于离散且有限的输入分布。对于连续分布的处理,作者认为需要进一步研究。

针对离散数据概率分布的MCMC算法python实现


对于mcmc算法,如何选择状态转移矩阵对实验结果是否有影响,设计下面几组实验

  1. 输入为p=[0.9,0.05,0.05],取q为[1/3,1/3,1/3],输出10000000个样本,观察样本的概率分布,代码如下:
#coding=utf-8
'''
Created on 2016年9月14日
基本MCMC算法以及M-H算法的python实现
@author: whz
p:输入的概率分布,离散情况采用元素为概率值的数组表示
N:认为迭代N次马尔可夫链收敛
Nlmax:马尔可夫链收敛后又取的服从p分布的样本数
isMH:是否采用MH算法,默认为True
'''
from __future__ import division
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from array import array
def mcmc(p,N=10000,Nlmax=10000,isMH=True):
    A = np.array([[1.0 / len(p) for x in range(len(p))] for y in range(len(p))], dtype=np.float64) 
    X0 = np.random.randint(len(p))
    count = 0
    samplecount = 0
    L = array("d",[X0])
    l = array("d")
    while True:
        X = L
### 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]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值