如何对Emcee采样器可选取的参数值范围设置限制
emcee 参数范围限制方案
你目前想到的给非法参数值设置极低似然的方案是可行的,且是 emcee 生态下的主流实现方式。emcee 本身没有内置原生的硬边界限制接口,没有办法从算法层面完全阻止采样器生成边界外的提议参数,但可以通过以下两种方案实现等效的范围限制效果:
- 方案1:在对数先验函数中添加边界判断(优先推荐)
把参数范围限制作为先验信息写入对数先验函数,而非修改似然函数,更符合贝叶斯推断的逻辑,实现也最简单:
import numpy as np def log_prior(theta): N = theta[0] # 此处根据你的参数顺序调整索引 # 依次判断所有参数的合法范围 if 0 < N < 100: return 0.0 # 合法范围内设置为均匀先验,可根据需求修改为其他先验分布 return -np.inf # 超出范围直接返回负无穷 # 总的对数后验函数传给emcee def log_posterior(theta, data): lp = log_prior(theta) if not np.isfinite(lp): return -np.inf return lp + logL(theta, data)
初始化EnsembleSampler时传入这个log_posterior即可,超出范围的提议步会被采样器100%拒绝,最终得到的样本全部落在合法范围内,和「根本不选取非法值」的效果完全一致。
- 方案2:参数空间变换
如果希望采样过程完全不涉及边界判断,可以将有界的参数通过变换映射到无界空间,采样完成后再转换回原参数空间:- 仅限制下限(比如N>0):采样无界的
log_N,使用时转换为N = np.exp(log_N) - 同时限制上下限(比如0<N<100):采样无界的
x,使用时转换为N = 100 / (1 + np.exp(-x))
注意这种方案需要对先验做雅可比修正,否则得到的后验分布会有偏差,适合对贝叶斯统计基础比较熟悉的场景使用。
- 仅限制下限(比如N>0):采样无界的
内容的提问来源于stack exchange,提问作者user1551817
相关产品推荐
相关产品推荐

