【问题标题】:how to add deterministic vector operations in PYMC3?如何在 PYMC3 中添加确定性向量操作?
【发布时间】:2017-02-13 01:38:40
【问题描述】:

如何在 PYMC3 中实现确定性向量运算?例如模型:

M ~ Unif(-5, 5)
S ~ Unif(0, |1 / M|)
data ~ Normal(M, S)

M 是高斯观测的平均值,S 是标准差。假设标准偏差均匀分布在 [0, |1/M|] 中(当 M 为负时需要绝对值)。

这段代码:

import pymc3 as pm
import numpy as np
size = 20
with pm.Model() as model:
    # M ~ Unif(-5, 5)
    M = pm.Uniform("M", -5., 5., shape=size)
    # S ~ Unif(0, |1 / M|)
    # how to divide by vector and take abs val?
    S = pm.Uniform("S", np.zeros(size), abs(1. / M), shape=size)
    data = pm.Normal("data", M, sd=S, shape=size)

有错误:

  File "/Users/mvd/anaconda/lib/python2.7/site-packages/pymc3/distributions/distribution.py", line 67, in get_test_val
    str(defaults) + " pass testval argument or adjust so value is finite.")
AttributeError: <pymc3.distributions.continuous.Uniform object at 0x10d1e1f10> has no finite default value to use, checked: ['median', 'mean', 'mode'] pass testval argument or adjust so value is finite.

我需要使用 theano 来实现对向量的这种操作吗?

【问题讨论】:

    标签: python numpy theano pymc pymc3


    【解决方案1】:

    我猜你的模型有问题的部分是1/M。因为这在 M 接近 0 时趋于无穷大。事实上,在您的示例中,M 的第一个建议值为 0(下边界和上边界的平均值),因此您得到“无有限值”的错误(错误来自变量 S)。

    解决此问题的一种方法是将合理的 testval 值传递给 M(在这种情况下,除了 0 之外的任何值),例如:

    M = pm.Uniform("M", -5., 5., shape=size, testval=0.1)
    

    现在 M 将被初始化为 0.1(而不是 0。)

    顺便说一句,直觉上我认为 NUTS 将无法从该模型中正确采样,因此我认为 Metropolis 在这里可能是更好的选择,但请随意尝试不同的采样器。

    【讨论】:

    • 谢谢。另外:什么时候可以在 PYMC3 中使用诸如abs(1. / M) 之类的随机变量的确定性表达式,而无需为它们制作自定义 theano 函数?为什么pm.Uniform("S", np.zeros(size), abs(1. / M), shape=size) 简单有效?
    • 不客气。 Theano 理解像 / 这样的运算符,并且您可以混合使用 python/NumPy 和 theano 变量。您不能直接将 theano 变量用于需要 python/NumPy 变量的函数。在这种情况下,您可以使用 as_op 装饰器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多