如何为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] 语法)。
我遵循了 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] 语法)。