问题描述
如何在 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楼
我猜你的模型有问题的部分是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 在这里可能是更好的选择,但可以随意尝试不同的采样器。