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

2024-04-20 14:13:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如您所见,c为负数可能更好。因此,我想知道如何用负值来定义c的先验值。{1分布,但仅限于负分布。在

一般来说,我想知道是否可以设置参数的界限?在

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

^{pr2}$

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


Tags: 模型功能log参数定义教程线性先验
1条回答
网友
1楼 · 发布于 2024-04-20 14:13:39

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

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

如果您想访问跟踪中的值,可以告诉pymc3将其包装在pm.Deterministic中(在这种简单的情况下,可能没有用处…)

^{pr2}$

使用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]语法的截断分布)。在

相关问题 更多 >