我遵循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 \。
答案 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]语法)。