пиро: как указать условное распределение
Я пытаюсь использовать пиро для указания байесовской сети. У меня есть дочерний узел
D
который является непрерывным и имеет три дискретных узла - родителей, каждый из которых имеет 10 возможных состояний:
Итак, сначала я определяю свои дискретные узлы как:
import torch
import pyro
import pyro.distributions as dist
def model(data):
A = pyro.sample("A", dist.Dirichlet(torch.ones(10)))
B = pyro.sample("B", dist.Dirichlet(torch.ones(10)))
C = pyro.sample("C", dist.Dirichlet(torch.ones(10)))
Теперь, насколько я понимаю, мне нужно определить
P(D|A, B, C)
. Я хочу смоделировать это как нормальное распределение, но не знаю, как это сделать. Мой план состоит в том, чтобы поставить априорные значения для параметров этого распределения, а затем использовать MCMC или HMC для оценки апостериорного распределения и изучения параметров модели.
Однако не знаю, как продолжить определение модели.
1 ответ
Хорошая вещь о
pyro
заключается в том, что определение модели очень питоническое. Базовый механизм PyTorch может отслеживать зависимости за вас.
Все, что вам нужно, это использовать образцы
A
,
B
а также
C
и вычислить параметры условного
p(D|A,B,C)
def cond_mean(a, b, c):
return # use a,b,c to compute mean
def cond_scale(a, b, c):
return # use a,b,c to compute scale
def model(data):
A = pyro.sample("A", dist.Dirichlet(torch.ones(10)))
B = pyro.sample("B", dist.Dirichlet(torch.ones(10)))
C = pyro.sample("C", dist.Dirichlet(torch.ones(10)))
D = pyro.sample("D", dist.Normal(loc=cond_mean(A, B, C), scale=cond_scale(A, B, C)
...