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

how to add deterministic vector operations in PYMC3?

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

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

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

此代码:

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/M。因为当 M 接近 0 时,这会变得无穷大。实际上,在您的示例中,M 的第一个建议值是 0(上下边界的平均值),因此您得到 "no finite value" 的错误(错误来自变量 S).

解决此问题的一种方法是将合理的 testval 值传递给 M(在本例中为除 0 以外的任何值),例如:

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

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

附带说明一下,直觉上我认为 NUTS 很难从这个模型中正确采样,因此我认为 Metropolis 在这里可能是更好的选择,但请随意尝试不同的采样器。