使用PyMC3计算最大似然

9

有时我对Bayesian推断的完整后验分布并不感兴趣,而只关心最大似然(或最大后验概率,如果先验设定合适),以及可能的Hessian矩阵。PyMC3有相关函数可以实现,但find_MAP函数返回的模型参数可能会因为先验分布而被转换。是否有一种简单的方法可以得到这些未经变换的值呢?find_hessian的输出对我来说甚至更加不清楚,但很可能也在转换空间中。

2个回答

6
也许更简单的解决方案是传递参数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吗?

(意思是:你是否考虑过使用ADVI呢?)

1
我有,但在我的情况下,模型足够简单,以至于MAP + Hessian很好地描述了后验分布(它接近正态分布)。MAP + Hessian的计算速度比ADVI或MC采样快得多。当然,这是对pymc3的滥用(通过不进行采样),但他们的模型规范很棒,我想保留采样选项,以防模型/数据的变化导致更复杂的后验分布。 - burnpanck

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 将以相同顺序输出对应变量的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接