【问题标题】:Sampling from a Bayesian network with evidence in tensorflow-probability从带有张量流概率证据的贝叶斯网络中采样
【发布时间】:2019-06-03 11:22:36
【问题描述】:

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

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

【问题讨论】:

    标签: bayesian-networks tensorflow-probability


    【解决方案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。

    【讨论】:

    • 谢谢克里斯,也许我在用大锤子敲错钉子。我知道 TFD 的优势在于贝叶斯深度学习或具有连续密度的分层 BN。我提出的示例是超级基础的,并且在 pymc3 中很容易解决,但鉴于 pymc3 建立在现已停产的 Theano 之上,我想我正在尝试选择最有前途的工具来学习 TFD。
    • 当然!做你想做的事当然没有错,我希望我的回复没有让人沮丧:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2013-04-17
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多