如何为pymc3模型中的参数添加约束?

How to add constraints to parameters in pymc3 model?

我遵循了 pymc3 中关于线性回归的第一个教程。我试着让它适应不同的功能,即:

Y_obs = log (x+a)^2 / (x-c)^2

如您所见,c 为负数可能更可取。因此我想知道如何用负值定义 c 的先验。例如,HalfNormal 分布但只有负值而不是正值。

更一般地说,我想知道是否可以为参数设置界限?

例如,在模型设置中使用 Stan(或 pyStan),您可以这样写:

parameters {
    real<lower=0, upper=1> p;
}

设置 p \in [0, 1].

要获得一个限制为负值的变量,您可以定义一个正值并取其负值:

a = pm.HalfNormal('a', sd=1)
b = -a

如果你想访问跟踪中的值,你可以告诉 pymc3 通过将它包装在 pm.Deterministic 中来存储它(可能不是 that 在一个简单的像这样的情况...)

a = pm.HalfNormal('a', sd=1)
b = pm.Deterministic('b', -a)

使用pm.Bound添加任意约束:

NegNormal = pm.Bound(pm.Normal, lower=-np.inf, upper=0)
a = NegNormal('a', mu=0, sd=1)

但请记住,这不会改变正态分布的密度,因此它不会再积分为 1。通常这无关紧要,因为 logp 的差异将是一个常数,而且我们不关心大多数事情的常数。如果它确实很重要(这可能是下限或上限是一个变量)你可以通过使用 pm.DensityDist 定义你自己的分布来解决这个问题(顺便说一句,stan 中的相同问题,尽管它支持截断分布T[a,b] 语法)。