2

有没有一种简单的方法可以从张量流概率的联合分布中“观察”证据和样本?例如,在 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 设置证据并从后验中采样以估计概率。

(显然,可以通过先无条件抽样然后丢弃与证据不一致的样本来使用拒绝抽样,但这会相当低效。)

4

1 回答 1

1

一般来说,后验采样很难:)

要获得用于 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。

于 2019-06-04T17:30:57.203 回答