使用PyMC3计算最大似然

时间:2016-11-20 12:10:12

标签: python statistics pymc3

有些情况下,我实际上并不感兴趣贝叶斯推断的完全后验,而只是最大可能性(或适当选择的先验的最大后验),并且可能是Hessian。 PyMC3具有执行此操作的功能,但find_MAP似乎以转换形式返回模型参数,具体取决于它们之前的分布。有没有一种简单的方法可以从这些中获得未转换的值? find_hessian的输出对我来说更不清楚,但它最有可能在变换的空间中。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我再一次遇到这个问题,并找到了一种从转换过的值中获取未转换值的方法。以防其他人需要这样做。它的要点是未转换的值基本上是可以在给定转换值的情况下评估的theano表达式。 PyMC3通过提供Model.fn()函数来帮助实现这一点,该函数创建了一个按名称接受值的评估函数。现在,您只需要向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然后会以相同的顺序输出相应变量的值。