Как добавить ограничения к параметрам в модели pymc3?

Я следовал за первым уроком в 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].

1 ответ

Решение

Чтобы получить переменную, которая ограничена отрицательными значениями, вы можете определить положительное значение и взять отрицательное значение этого:

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]).

Другие вопросы по тегам