TL; DR
Как правильно выполнять апостериорные прогностические проверки для pm.Deterministic
переменных, которые принимают стохастику (представляя детерминированную также стохастическую) в качестве входных данных?
Слишком короткий; Не понял
Скажем, у нас есть такая модель pymc3
:
import pymc3 as pm
with pm.Model() as model:
# Arbitrary, trainable distributions.
dist1 = pm.Normal("dist1", 0, 1)
dist2 = pm.Normal("dist2", dist1, 1)
# Arbitrary, deterministic theano math.
val1 = pm.Deterministic("val1", arb1(dist2))
# Arbitrary custom likelihood.
cdist = pm.DensityDistribution("cdist", logp(val1), observed=get_data())
# Arbitrary, deterministic theano math.
val2 = pm.Deterministic("val2", arb2(val1))
Возможно, я неправильно понимаю, но я намереваюсь сделать выборку апостериорных значений dist1
и dist2
и передать эти выборки в детерминированные переменные. Возможна ли апостериорная прогностическая проверка только для наблюдаемых случайных величин?
Получить апостериорные прогностические выборки из dist2
и других случайных переменных, используя pymc3.sampling.sample_ppc
, несложно, но большая часть значения моей модели получена из состояния val1
и val2
с учетом этих выборок.
Проблема возникает в том, что pm.Deterministic(.)
, кажется, возвращает th.TensorVariable
. Итак, когда это называется:
ppc = pm.sample_ppc(_trace, vars=[val1, val2])["val1", "val2"]
...и pymc3
пытается выполнить этот блок кода в pymc3.sampling
:
410 for var in vars:
--> 411 ppc[var.name].append(var.distribution.random(point=param,
412 size=size))
... он жалуется, потому что th.TensorVariable
явно не имеет .distribution
.
Итак, как правильно провести апостериорные выборки стохастики через детерминистику? Нужно ли мне явно создавать th.function
, который берет стохастические апостериорные выборки и вычисляет детерминированные значения? Это кажется глупым, учитывая тот факт, что у pymc3
уже есть график.