郭震 AI公众号:郭震AI

21 Metropolis-Hastings算法

发布日期:

最近更新:

分类: 贝叶斯学习

预计阅读: 4 分钟

阅读次数: 0

预计阅读4 分钟
结构重点9 个
图文要点6 张
正文规模1.6k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 9 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

Metropolis-Hastings算法结构图查看大图
MetropolisHastings算法结构图

贝叶斯学习的重点是把已有判断和新证据合在一起,并明确表达不确定性。阅读时可以按「算法原理 -> 目标分布 -> 提议分布 -> 接受率」建立结构,再回到正文里的代码、案例或指标做验证。

Metropolis-Hastings算法核对图查看大图
MetropolisHastings算法核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「算法原理」,再查「目标分布」。

在马尔可夫链蒙特卡洛(MCMC)方法中,Metropolis-Hastings算法是一个重要的产生采样方法,广泛应用于贝叶斯学习和统计推断的领域。它是一种构建马尔可夫链的方法,通过从一个指定的概率分布中生成样本,来近似该分布。接下来,我们将详细探讨该算法的原理、步骤和应用案例。

算法原理

Metropolis-Hastings算法Gibbs采样的推广,适用于更为复杂的联合分布。该算法的主要思想是通过在目标分布和建议分布之间建立一种接受-拒绝机制,来有效生成所需样本。

Metropolis-Hastings算法判断卡查看大图
MetropolisHastings算法判断卡

学习 Metropolis-Hastings 时,先看目标分布、候选分布、接受概率、链更新、 burn-in 和样本混合情况。

目标分布

假设我们要从一个复杂的概率分布 p(x)p(x) 中采样。通常,目标分布为后验分布,通常是难以直接采样的。

提议分布

为了生成样本,我们引入一个可行的提议分布 q(xx)q(x'|x),其用于从当前位置 xx 中生成一个新样本 xx'。典型的提议分布可以是对称的,如正态分布。

接受率

在生成新样本后,我们计算接受率 αα,决定是否接受新样本。接受率的计算公式为:

α=min(1,p(x)q(xx)p(x)q(xx))\alpha = \min\left(1, \frac{p(x')q(x|x')}{p(x)q(x'|x)}\right)
  • α1α \geq 1,则无条件接受新样本。
  • 否则,以概率 αα 接受新样本。

算法步骤

  1. 选择初始点 x0x_0
  2. 迭代 nn 次:
    • 从提议分布 q(xx)q(x'|x) 中生成新样本 xx'
    • 计算接受率 αα
    • 生成一个均匀随机数 uUniform(0,1)u \sim \text{Uniform}(0, 1)
    • 如果 u<αu < α,则接受 xx', 令 xt+1=xx_{t+1} = x';否则,保留旧样本,令 xt+1=xx_{t+1} = x

算法示例

让我们通过一个具体的案例,使用Metropolis-Hastings算法从一个目标分布中采样。

贝叶斯学习阅读地图卡查看大图
贝叶斯学习阅读地图卡

进入《Metropolis-Hastings算法》正文前,可以先扫一遍配图:它在问什么、要分清哪些概念、哪一步值得动手、最后用什么标准验收。

目标分布示例

假设我们的目标是从一个一维的正态分布中采样,设其均值为 μ=0\mu=0,标准差为 σ=1\sigma=1。我们设定提议分布为当前点附近的正态分布,例如 q(xx)N(x,1)q(x'|x) \sim \mathcal{N}(x, 1)

Python实现

下面是使用Python实现Metropolis-Hastings算法的一个示例代码:

import numpy as np
import matplotlib.pyplot as plt

# 目标分布: 标准正态分布
def target_distribution(x):
    return np.exp(-0.5 * x**2) / np.sqrt(2 * np.pi)

# 提议分布: 正态
def proposal_distribution(x):
    return np.random.normal(x, 1)

# Metropolis-Hastings算法
def metropolis_hastings(iterations):
    samples = []
    x = 0  # 初始化
    for _ in range(iterations):
        x_new = proposal_distribution(x)
        acceptance_ratio = target_distribution(x_new) / target_distribution(x)
        
        if np.random.rand() < acceptance_ratio:
            x = x_new
        
        samples.append(x)
    return np.array(samples)

# 生成样本
n_samples = 10000
samples = metropolis_hastings(n_samples)

# 绘图
plt.figure(figsize=(12, 6))
plt.hist(samples, bins=30, density=True, alpha=0.6, color='g')

# 绘制目标分布
x = np.linspace(-4, 4, 1000)
plt.plot(x, target_distribution(x), 'r', lw=2)
plt.title('Metropolis-Hastings Sampling')
plt.xlabel('x')
plt.ylabel('Density')
plt.legend(['Target Distribution', 'Samples'])
plt.show()

这段代码首先定义了目标分布和提议分布。然后实施了Metropolis-Hastings算法,并对生成的样本进行了可视化。你可以看到,样本的分布逐渐趋近于目标分布。

MetropolisHastings算法应用复盘卡查看大图
MetropolisHastings算法应用复盘卡

复习《MetropolisHastings算法》时,建议把关键概念、操作步骤和可见结果放在同一页里回看。

MetropolisHastings算法应用检查卡查看大图
MetropolisHastings算法应用检查卡

练习《MetropolisHastings算法》时,建议把输入条件、处理动作和可见结果写在一起,方便下次复查。

结论

Metropolis-Hastings算法是MCMC的一个强大工具,能够在无法直接采样的情况下,从复杂的后验分布中生成样本。本节中,我们不仅讨论了算法的原理及其步骤,还提供了实际代码的示例,帮助你在实际应用中理解和实现这一算法。

在下一篇中,我们将探讨贝叶斯学习在实际中的应用案例,深入理解这一理论如何通过实际问题得以体现。

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

Metropolis-Hastings算法适合谁读?

这是 贝叶斯学习入门 系列第 21 / 24 篇,适合正在学习贝叶斯学习入门,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇贝叶斯学习入门教程要多久?

按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...