Как добавить ограничения к параметрам в модели 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]).