当前位置: 代码迷 >> python >> 如何在 PYMC3 中添加确定性向量运算?
  详细解决方案

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

热度:80   发布时间:2023-06-13 15:31:09.0

如何在 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/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 在这里可能是更好的选择,但可以随意尝试不同的采样器。