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

时间:2017-05-16 11:03:05

标签: python pymc3

我遵循pymc3中关于线性回归的第一个教程。我试图将它改编为不同的功能:

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

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

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

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

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

在[0,1]中设置p \。

1 个答案:

答案 0 :(得分:3)

要获得一个受限于负值的变量,您可以定义一个正值,并取消负值:

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

如果你想访问跟踪中的值,你可以告诉pymc3将它包装在pm.Deterministic中(可能不是 在这样的简单情况下有用)。 。)

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]语法)。