pymc 3.0预测后验分布

时间:2013-11-19 00:59:30

标签: python bayesian pymc

我正在将一个非常简单的例子从pymc 2.3转换为pymc 3.0,似乎无法弄清楚如何从预测后验分布中采样(或获取MAP)。根据文档中的建议(7.3模型检查和对角线诊断:拟合优度),我可以使用pymc 2.3通过添加未观察到的随机数来从该分布中进行采样。这是一个link to the notebook。一切似乎都运作良好。

但是,当我尝试在pymc 3.0中执行此操作时,会发生两件奇怪的事情。

  1. MAP值甚至没有接近,好像未观察到的随机性正在影响最小化,而未观察到的随机性的MAP值是错误的?
  2. NUTS采样器不会改变未观察到的随机数的值,因此跟踪只是单个值10。
  3. 当然,如果观察到的随机指标不存在,这个值就有意义了。如何在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 :(得分: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])