基于Python网格搜索构建经典抛硬币问题的后验分布
网格搜索法近似抛硬币问题的贝叶斯后验分布
最近我正在啃《Bayesian Analysis with Python》这本书,里面作者给出的Python代码示例特别直观,刚好能帮我理解怎么用网格搜索法来近似经典抛硬币问题的后验分布,这里整理一下我的理解:
- 核心逻辑:先给抛硬币正面朝上的概率(我们记为$\theta$)设定一个先验分布,然后结合观测到的抛硬币数据,用二项分布作为似然函数来推导后验。
- 网格搜索的具体操作:把$\theta$的可能取值区间$[0,1]$拆分成若干等份(示例里是拆成100段),得到101个离散的$\theta$候选值。接下来对每个候选值依次计算:
- 该$\theta$对应的先验概率$P(\theta)$
- 基于这个$\theta$,观测到当前数据的似然$P(data|\theta)$
- 将先验与似然相乘得到未归一化的后验概率,最后对所有候选值的结果做归一化处理,就能得到近似的后验分布了
这里插一句,网格搜索的好处是简单易懂,完全不用复杂的数学推导,适合刚入门贝叶斯的朋友上手,但缺点也很明显——如果参数维度变多,计算量会爆炸式增长,所以只适合单参数的简单问题。
如果要把这个思路落地成Python代码,大概的框架是这样的(参考书中的示例):
import numpy as np import matplotlib.pyplot as plt # 1. 生成网格点,将[0,1]拆分为101个候选值 theta_grid = np.linspace(0, 1, 101) # 2. 定义先验分布(这里以均匀先验为例) prior = np.ones_like(theta_grid) # 所有theta的先验概率相等 # 3. 定义似然函数(二项分布) data = {'heads': 6, 'tails': 4} # 观测数据:6次正面,4次反面 likelihood = theta_grid ** data['heads'] * (1 - theta_grid) ** data['tails'] # 4. 计算未归一化后验,再做归一化处理 posterior_un_norm = prior * likelihood posterior = posterior_un_norm / posterior_un_norm.sum() # 5. 可视化近似后验分布 plt.plot(theta_grid, posterior) plt.xlabel(r'$\theta$ (Probability of heads)') plt.ylabel('Posterior Probability') plt.title('Approximate Posterior via Grid Search') plt.show()
内容的提问来源于stack exchange,提问作者Iltl
相关产品推荐
相关产品推荐

