首页 文章

pymc 3.0预测后验分布

提问于
浏览
2

我似乎想知道如何从预测后验分布中采样(或获得MAP) . 根据文档中的建议(7.3模型检查和对角线诊断:拟合优度),我可以使用pymc 2.3通过添加未观察到的随机数来从该分布中进行采样 . 这是link to the notebook . 一切似乎都运作良好 .

但是当我在pymc 3.0尝试这样做时,会发生两件奇怪的事情 .

  • MAP值甚至没有接近,好像未观察到的随机性正在影响最小化,并且未观察到的随机性的MAP值是错误的?

  • NUTS采样器不会改变未观察到的随机数的值,因此跟踪只是单个值10 .

当然,如果观察到的随机不存在,这个值是有意义的 . 如何在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])

1 回答

  • 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])
    

相关问题