首页 文章

使用PyMC3计算最大似然

提问于
浏览
4

有些情况下,我是Hessian . PyMC3具有执行此操作的功能,但 find_MAP 似乎以转换形式返回模型参数,具体取决于它们上的先前分布 . 有没有一种简单的方法可以从这些中获得未转换的值? find_hessian 的输出对我来说更不清楚,但它最有可能也在转型空间中 .

2 回答

  • 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

    我再次遇到这个问题,并找到了一种方法来从转换后的值中获得未转换的值 . 以防其他人需要这样做 . 它的要点是未转换的值基本上是可以在给定转换值的情况下评估的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 将以相同的顺序输出相应变量的值 .

相关问题