如何在PYMC3中添加确定性向量运算?

时间:2017-02-13 01:38:41

标签: python numpy theano pymc pymc3

如何在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在向量上实现此操作?

1 个答案:

答案 0 :(得分:1)

我猜你的模型中有问题的部分是1/M。因为当M逼近0时,这会变为无穷大。实际上在你的例子中,M的第一个建议值是0(下边界和上边界的平均值),因此错误是&#34;没有有限值&#34;你得到了(错误来自变量S)。

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

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

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

作为旁注,直觉上我认为NUTS很难从这个模型中正确采样,因此我认为Metropolis可能是更好的选择,但可以随意尝试不同的采样器。