我正在将一个非常简单的例子从pymc 2.3转换为pymc 3.0,似乎无法弄清楚如何从预测后验分布中采样(或获取MAP)。根据文档中的建议(7.3模型检查和对角线诊断:拟合优度),我可以使用pymc 2.3通过添加未观察到的随机数来从该分布中进行采样。这是一个link to the notebook。一切似乎都运作良好。
但是,当我尝试在pymc 3.0中执行此操作时,会发生两件奇怪的事情。
当然,如果观察到的随机指标不存在,这个值就有意义了。如何在pymc 3.0中找到预测后验的MAP值和取样?
更新:
这是一个最小的例子,说明我做错了什么:
import pymc as mc
with mc.Model() as model:
p = mc.Beta('p',2,2)
surv_sim = mc.Binomial('surv_sim',n=20,p=p)
surv = mc.Binomial('surv',n=20,p=p,observed=15)
with model:
step = mc.step_methods.HamiltonianMC(vars=model.vars) #Again must specificy
#model.vars or else
#only continuous values will
#be sampled
with model:
trace = mc.sample(100000,step)
mc.traceplot(trace);
with model:
map_est = mc.find_MAP(vars=model.vars) #Must Specify model.vars, or else
#only continuous stochastics will
#be fit, however this fit will be
#horrible
我想我自己已经部分回答了这个问题。首先是抽样。据我所知,NUTS采样器不具备处理离散变量的能力。然而,Metropolis采样器肯定处理离散(在问题#235中解决),而HamiltonianMC采样器似乎也处理离散变量。
然而,离散随机指标的MAP估计注定是坏的。即使您指定使用所有变量(不是默认值)。由于离散随机对数逻辑概率函数返回任何离散随机函数的最大值的对数概率,因此无论使用哪种scipy最小化函数都将捕获局部最优值。最小化将仅优化连续随机指标,同时保持离散的随机指标,因为离散变量中的小步骤都不会导致对数概率的改善。当你同时拥有离散变量和连续变量时,我不确定这是一个错误还是仅仅是找到MAP估计值的基本限制。
更新2:
如果您使用多个步骤,采样效果会更好。对于上述型号,您可以使用。
with model:
step1 = mc.step_methods.NUTS(vars=[p])
step2 = mc.step_methods.Metropolis(vars=[surv_sim])
with model:
trace = mc.sample(100000,[step1,step2])
答案 0 :(得分:0)
最近有很多关于PyMC3的开发活动,所以我想我会对你的问题发表一些答案,即使你在一年多前就已经发现了这个问题。
首先,pymc3.find_MAP
函数现在尝试处理离散变量,因此要查找MAP,您只需要执行此操作:
import pymc3 as pm
m = pm.Model()
with m:
p = pm.Beta('p',2,2)
surv_sim = pm.Binomial('surv_sim', n=20, p=p)
surv = pm.Binomial('surv', n=20, p=p, observed=15)
map_est = pm.find_MAP()
map_est
对我来说,这会产生以下结果
{'p': array(0.6190476210094416), 'surv_sim': 10.0}
这似乎不正确。也许这值得一个bug报告。
从后验分布中采样现在需要明确选择步骤方法,对于离散变量pymc3.step_methods.Metropolis
是可接受的选择。在这个例子中它也可以用于连续变量:
with m:
step1 = pm.step_methods.Metropolis(vars=[p])
step2 = pm.step_methods.Metropolis(vars=[surv_sim])
trace = pm.sample(10000, [step1, step2])