PyMC3 3.11.4调用hpd函数提示无对应属性报错如何解决?
报错原因
PyMC3自3.11.0版本起,将HPD(最高后验密度)计算等统计工具函数从内置的pymc3.stats模块迁移到了独立的统计诊断依赖库ArviZ中,你使用的3.11.4版本已经完全移除了pymc3.stats.hpd接口,因此两种调用方式都会触发属性错误。
可行解决方法
- 方法1:直接使用ArviZ的hpd接口(最推荐)
PyMC3安装时会默认附带ArviZ依赖,无需额外安装,仅需调整导入和调用语句即可,参数规则和原pm.stats.hpd完全兼容:
# 新增导入 import arviz as az import numpy as np from scipy import stats import pymc3 as pm # 原有业务代码不变 def posterior_grid_approx(grid_points=100, success=6, tosses=9): p_grid = np.linspace(0, 1, grid_points) prior = np.repeat(5, grid_points) likelihood = stats.binom.pmf(success, tosses, p_grid) unstd_posterior = likelihood * prior posterior = unstd_posterior / unstd_posterior.sum() return p_grid, posterior p_grid, posterior = posterior_grid_approx(grid_points=100, success=6, tosses=9) samples = np.random.choice(p_grid, p=posterior, size=int(1e4), replace=True) # 替换原来的pm.stats.hpd调用即可 az.hpd(samples, alpha=0.5)
- 方法2:降级PyMC3版本
如果必须沿用旧版pm.stats.hpd调用逻辑,可以将PyMC3降级到3.10.0及更早版本:
pip install pymc3==3.10.0
该方案不推荐,旧版本存在大量已知bug和兼容性问题。
- 方法3:手动实现HPD计算逻辑
如果不想引入额外依赖,可以手动实现一维样本的HPD计算:
def calc_hpd(samples, alpha=0.5): sorted_samples = np.sort(samples) n = len(sorted_samples) window_size = int(np.floor((1 - alpha) * n)) window_intervals = sorted_samples[window_size:] - sorted_samples[:n - window_size] min_interval_idx = np.argmin(window_intervals) return sorted_samples[min_interval_idx], sorted_samples[min_interval_idx + window_size]
内容的提问来源于stack exchange,提问作者xarles
相关产品推荐
相关产品推荐

