пиро: как указать условное распределение

Я пытаюсь использовать пиро для указания байесовской сети. У меня есть дочерний узел 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)
    ...
Другие вопросы по тегам