Выборка из байесовской сети с доказательством в тензорной вероятности - PullRequest
1 голос
/ 03 июня 2019

Есть ли простой способ "наблюдать" свидетельство и выборку из совместного распределения с вероятностью тензора? Например, в PyMC3 класс Distribution имеет параметр observed в своем конструкторе, так что можно легко получить подтверждение (и запустить MCMC для получения апостериорных выборок).

Есть некоторая документация, связанная с Эдвардом, но я не мог понять это для простого случая, такого как:

import tensorflow_probability.python.distributions as tfd
import tensorflow as tf

jdn = tfd.JointDistributionNamed(dict(
    dist_x=tfd.Categorical([0.2, 0.8], validate_args=True),
    dist_y=lambda dist_x: tfd.Categorical(probs=tf.gather([[0.1, 0.9],
                                                               [0.5, 0.5]], indices=dist_x))
))
# sample from joint
print(jdn.sample(100, seed=1234))

# now "observe" some variables
observed_variable = jdn.model.get('dist_x')
assert isinstance(observed_variable, tfd.Distribution)

observed_variable.?

Вероятно, это самая простая байесовская сеть с двумя двоичными переменными X и Y. Цель состоит в том, чтобы установить доказательства для X или Y и произвести выборку сзади для оценки вероятностей.

(Очевидно, что можно использовать выборку отбраковки, сначала отбирая образцы без условий, а затем выбрасывая образцы, не согласующиеся с данными, но это будет довольно неэффективно.)

1 Ответ

0 голосов
/ 04 июня 2019

В общем, задняя выборка трудна:)

Чтобы получить ненормализованную плотность цели для использования в схеме MCMC, вы можете сделать что-то вроде

import tensorflow_probability.python.distributions as tfd
import tensorflow as tf
import functools

jdn = tfd.JointDistributionNamed(dict(
    x=tfd.Categorical([0.2, 0.8], validate_args=True),
    y=lambda dist_x: tfd.Categorical(probs=tf.gather([[0.1, 0.9],
                                                      [0.5, 0.5]], indices=x))
))

log_unnormalized_posterior = functools.partial(jdn.log_prob, x=data)
# ^-- this is a function of one variable (y), which is the (log) unnormalized
# posterior conditioned on `x=data`.

Чтобы получить фактическую апостериорздесь вам нужно будет оценить эту функцию вероятности журнала для всех возможных значений y, а затем нормализовать их.Затем вы можете скормить их новым категориям, которые будут фактически задними.У нас нет постоянного способа сделать это в TFP, в основном потому, что дискретное перечисление, как правило, очень дорого.Для выборки из плотностей по непрерывным переменным у нас есть хорошая поддержка гамильтониана Монте-Карло, которая будет следовать по существу тому же рецепту, что и выше, «привязывая» наблюдаемые переменные к некоторым данным, чтобы получить ненормализованную плотность цели и используя ее для MCMC.

...