Loading... # 贝叶斯统计入门指南 # 一、概述 ## 1. 简介 ### A. 是什么 贝叶斯统计是一种统计推断方法,它将概率视为对不确定性的度量,而非事件发生的长期频率。与频率学派统计不同,贝叶斯统计将模型参数视为随机变量,通过数据不断更新对参数的认知。 ### B. 为什么学 - 提供更直观的不确定性量化方式 - 先验知识可以自然地融入模型 - 特别适合小数据场景和复杂模型 - 可信区间比置信区间更易理解 ### C. 学完能做什么 - 理解贝叶斯与频率学派的核心区别 - 使用贝叶斯方法进行参数估计 - 应用 PyMC 等 MCMC 工具解决实际问题 - 构建包含先验知识的稳健模型 ## 2. 前置知识 ### A. 必备技能 - 基础概率论概念 - 条件概率和贝叶斯定理 - Python 编程基础 ### B. 推荐知识 - 频率学派统计基础 - 最大似然估计 - 线性回归 # 二、核心概念 ## 1. 哲学差异 贝叶斯统计与频率学派统计的根本区别在于对概率的理解: | 维度 | 频率学派 | 贝叶斯学派 | |------|---------|-----------| | 参数 | 固定但未知 | 随机变量,服从分布 | | 数据 | 随机抽样 | 固定观测值 | | 概率 | 长期频率 | 不确定性的度量 | | 区间估计 | 置信区间 | 可信区间 | ### A. 置信区间 vs 可信区间 - 置信区间:如果重复抽样多次,95% 的区间会包含真实参数 - 可信区间:参数有 95% 的概率落在该区间内 ```mermaid graph LR A[问题] --> B{统计框架} B --> C[频率学派] B --> D[贝叶斯学派] C --> E[参数固定] C --> F[数据随机] C --> G[置信区间] D --> H[参数分布] D --> I[数据固定] D --> J[可信区间] ```  ## 2. 贝叶斯定理 贝叶斯推断的核心是贝叶斯定理: ``` P(θ|X) = P(X|θ) × P(θ) / P(X) ``` 其中: - P(θ|X):后验分布,是我们想求解的 - P(X|θ):似然函数,表示给定参数下观测数据的概率 - P(θ):先验分布,表示对参数的初始认知 - P(X):标准化常数,通常不需要显式计算 ```mermaid graph TD A[先验分布] --> B[观测数据] B --> C[似然函数] A --> D[贝叶斯定理] C --> D D --> E[后验分布] E --> F[后验预测分布] ```  ## 3. 核心术语 - 先验分布:对参数的初始假设 - 似然函数:数据对参数的支持程度 - 后验分布:结合先验和数据后的参数认知 - MAP 估计:最大后验概率估计 - 后验预测分布:对新数据的预测分布 # 三、快速上手 ## 1. 骰子问题示例 假设你观察到一个骰子投掷 8 次,结果为 [1, 1, 2, 3, 3, 4, 4, 4],但不知道骰子有多少面。 ### A. 频率学派方法 使用最大似然估计: ``` P(X|n) = (1/n)^8 ``` 当 n = 4 时似然最大,因为投掷结果的最大值为 4。95% 置信区间为 [4, 6]。 ### B. 贝叶斯学派方法 选择先验分布 P(n),计算后验分布: ``` P(n|X) ∝ (1/n)^k × P(n) ``` 使用均匀先验时,后验均值约为 4.26,95% 可信区间为 [4, 5]。 ## 2. 先验的影响 先验分布的作用: - 数据少时,先验影响大 - 数据多时,似然函数主导后验 - 好的先验可以补偿数据不足 ```python import pymc as pm import numpy as np # 观测数据 observations = np.array([1, 1, 2, 3, 3, 4, 4, 4]) k = len(observations) x_max = int(observations.max()) with pm.Model() as model: # 几何先验 excess = pm.Geometric("excess", p=0.5) - 1 n = pm.Deterministic("n", excess + x_max) # 似然函数 pm.Potential("likelihood", -k * pm.math.log(n)) # MCMC 采样 trace = pm.sample(10000, tune=2000, chains=4) # 获取后验分布 posterior_n = trace.posterior["n"].values.flatten() print(f"后验均值: {posterior_n.mean():.2f}") ``` ## 3. 环境准备 安装必要的 Python 库: ```bash pip install pymc arviz numpy matplotlib ``` # 四、进阶内容 ## 1. 实际应用案例 ### A. 地理分布建模 问题:根据历史订单数据生成合成数据,需要按地理位置分配订单。 频率学派问题: - 对新类别或新邮编不鲁棒 - 数据稀疏时估计分布噪声大 贝叶斯解决方案: - 使用 Dirichlet-Multinomial 分布建模似然 - 使用人口分布作为先验(非稀疏) - 先验作为数据不足时的后备 ## 2. 数值方法:MCMC 当后验分布无法解析求解时,使用马尔可夫链蒙特卡洛方法。 ### A. Metropolis 算法 从当前点 θ_t 提议新点 θ_{t+1},以以下概率接受: ``` min(1, P(θ_{t+1}|X) / P(θ_t|X)) ``` 关键优势:不需要计算标准化常数 P(X)。 ### B. NUTS 算法 PyMC 默认使用的 No-U-Turn Sampler,是 Hamiltonian Monte Carlo 的改进版本,效率更高。 ```mermaid graph LR A[定义先验] --> B[定义似然] B --> C[MCMC 采样] C --> D[后验分布] D --> E[统计分析] ```  ## 3. 线性回归的贝叶斯方法 ### A. 基础实现 ```python import pymc as pm import arviz as az with pm.Model() as model: # 先验 a = pm.Normal("a", mu=0, sigma=10) b = pm.Normal("b", mu=0, sigma=10) sigma = pm.HalfNormal("sigma", sigma=10) # 似然 y_obs = pm.Normal("y_obs", mu=a * x + b, sigma=sigma, observed=y) # 采样 trace = pm.sample(1000, tune=1000, chains=4) # 提取结果 a_mean = trace.posterior["a"].values.mean() b_mean = trace.posterior["b"].values.mean() ``` ### B. 处理异常值 使用混合模型处理异常数据: ```python with pm.Model() as model: # 先验 a = pm.Normal("a", mu=0, sigma=10) b = pm.Normal("b", mu=0, sigma=10) sigma = pm.HalfNormal("sigma", sigma=10) delta = pm.HalfNormal("delta", sigma=5) sigma_bgd = pm.Deterministic("sigma_bgd", sigma + delta) # 混合权重 gs = pm.Beta("gs", alpha=2, beta=2, shape=len(x)) # 混合似然 mu = a * x + b w = pm.math.stack([gs, 1 - gs], axis=1) pm.Mixture( "likelihood", w=w, comp_dists=[ pm.Normal.dist(mu=mu, sigma=sigma), pm.Normal.dist(mu=mu, sigma=sigma_bgd), ], observed=y, ) trace = pm.sample(1000, tune=1000, chains=4) ``` ## 4. 与正则化的关系 频率学派的正则化方法本质上是贝叶斯先验: - Ridge 回归(L2)= 高斯先验 - Lasso 回归(L1)= 拉普拉斯先验 目标函数: ``` θ_MAP = min_θ Σ(y_i - θ_0 - θ_1×x_i)^2/σ^2 + F(θ) ``` # 五、最佳实践 ## 1. 先验选择 - 使用无信息先验(均匀分布、宽高斯分布)当缺乏领域知识 - 使用有信息先验(领域知识)当数据稀疏 - 确保先验覆盖所有合理的参数值 ## 2. 收敛诊断 - 检查多条链的混合情况 - 查看 R-hat 统计量(应接近 1) - 检查轨迹图的自相关性 ## 3. 模型验证 - 使用后验预测检验 - 交叉验证 - 与频率学派方法对比 # 六、常见问题 ## 1. 先验是否敏感 数据少时敏感,数据多时影响小。Bernstein-von Mises 定理保证在大数据极限下,贝叶斯与频率学派方法收敛到同一结果。 ## 2. 计算成本 MCMC 方法计算成本较高,但对于复杂问题比解析求解可行得多。使用 NUTS 算法可以提高效率。 ## 3. 何时使用贝叶斯方法 - 小数据场景 - 需要融入先验知识 - 需要直观的不确定性量化 - 复杂层次模型 *** ## 参考资料 1. [Bayesian statistics for confused data scientists](https://nchagnet.pages.dev/blog/bayesian-statistics-for-confused-data-scientists/) 2. [Frequentism and Bayesianism: A Practical Introduction](https://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/) 3. [A Modern Introduction to Probabilistic Programming with PyMC](https://austinrochford.com/posts/intro-prob-prog-pymc.html) 4. [PyMC library homepage](https://www.pymc.io/welcome.html) 最后修改:2026 年 03 月 22 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏