2016-11-20 69 views
2

有些情况下,我并不真正对贝叶斯推断的完整后验感兴趣,而只是最大可能性(或对于适当选择的先验的最大后验),并且可能是Hessian。 PyMC3有这样做的功能,但find_MAP似乎返回转换形式的模型参数,取决于它们的先前分布。有没有一种简单的方法来从这些未转换的值? find_hessian的输出对我来说更不明显,但它最有可能也在转换的空间中。使用PyMC3计算最大似然率

回答

1

可能是简单的解决方案将是传递参数transform=None,避免PyMC3执行转换,然后使用find_MAP

我让你,比如一个简单的模型。

data = np.repeat((0, 1), (3, 6)) 
with pm.Model() as normal_aproximation: 
    p = pm.Uniform('p', 0, 1, transform=None) 
    w = pm.Binomial('w', n=len(data), p=p, observed=data.sum()) 
    mean_q = pm.find_MAP() 
    std_q = ((1/pm.find_hessian(mean_q))**0.5)[0] 
print(mean_q['p'], std_q) 

您是否考虑过使用ADVI

+0

我有,但在我的情况下,模型很简单,MAP + hessian很好地描述了后验分布(它接近于正常)。 MAP + hessian比ADVI或MC-sampling要快得多。当然,这是滥用pymc3(通过不采样),但他们的模型规范是伟大的,我想保留采样的选项,以防模型/数据的变化导致更复杂的后验。 – burnpanck

0

我再次遇到这个问题,并找到了从转换后的值中获取未转换值的方法。以防万一别人需要这样做。它的要点是未转换的值本质上是可以在给定转换后的值的情况下评估的表达式。通过提供Model.fn()函数,PyMC3在这方面有所帮助,该函数创建了一个按名称接受值的评估函数。现在,您只需将未转换的感兴趣变量提供给outs参数。一个完整的例子:

data = np.repeat((0, 1), (3, 6)) 
with pm.Model() as normal_aproximation: 
    p = pm.Uniform('p', 0, 1) 
    w = pm.Binomial('w', n=len(data), p=p, observed=data.sum()) 
    map_estimate = pm.find_MAP() 
# create a function that evaluates p, given the transformed values 
evalfun = normal_aproximation.fn(outs=p) 
# create name:value mappings for the free variables (e.g. transformed values) 
inp = {v:map_estimate[v.name] for v in model.free_RVs} 
# now use that input mapping to evaluate p 
p_estimate = evalfun(inp) 

outs还可以接收的变量的列表,evalfun然后将输出以相同的顺序对应的变量的值。