基于Tensorflow概率、Edward2和Python的离散贝叶斯网络

基于Tensorflow概率、Edward2和Python的离散贝叶斯网络,python,tensorflow,bayesian-networks,tensorflow-probability,edward,Python,Tensorflow,Bayesian Networks,Tensorflow Probability,Edward,我有一个简单的贝叶斯网络: state / \ / \ V V signal_1 signal_2 随机变量“状态”、“信号_1”和“信号_2”具有相应的离散值: Val(状态)={0,1,2,3},Val(信号_1)={0,1},和Val(信号_2)={0,1} 我有边缘概率分布p(状态)和条件概率分布p(信号1状态)和p(信号2状态)作为表格 联合概率p(状态,信号_1,信号_2)等于p

我有一个简单的贝叶斯网络:

        state
      /       \
     /         \
    V           V  
signal_1    signal_2
随机变量“状态”、“信号_1”和“信号_2”具有相应的离散值: Val(状态)={0,1,2,3},Val(信号_1)={0,1},和Val(信号_2)={0,1}

我有边缘概率分布p(状态)和条件概率分布p(信号1状态)和p(信号2状态)作为表格

联合概率p(状态,信号_1,信号_2)等于p(状态)*p(信号_1 |状态)*p(信号_2 |状态)和logp(状态,信号_1,信号_2)=logp(状态)+logp(信号_1 |状态)+logp(信号_2 |状态)

我试图用TensorFlow概率来构建这个模型:

备选案文1:

import tensorflow as tf
tfd = tfp.distributions

def joint_log_prob(state, signal_1, signal_2):
        state_prob = tf.constant([0.5, 0.1, 0.3, 0.1])
        signal_1_prob = tf.constant([[0.03, 0.97], [0.05, 0.95], [0.20, 0.80], [0.97, 0.03]])
        signal_2_prob = tf.constant([[0.03, 0.97], [0.97, 0.03], [0.97, 0.03], [0.99, 0.01]])

        state_dist = tfd.Categorical(probs=state_prob)
        signal_1_dist = tfd.Categorical(probs=signal_1_prob[state]) # state=0,1,2,3
        signal_2_dist = tfd.Categorical(probs=signal_2_prob[state]) # state=0,1,2,3

        return state_dist.log_prob(state) + signal_1_dist.log_prob(signal_1) + signal_2_dist.log_prob(signal_2)
例如,我的证据是“信号_1=1”和“信号_2=0”,我想得到“状态=0”的概率,即p(状态=0 |信号_1=1,信号_2=0)

我定义函数:

def unnormalized_log_posterior(state):
    return joint_log_prob(state, 1, 0)
变体2通过爱德华二世:

import tensorflow as tf
from tensorflow_probability import edward2 as ed

def model():
    state_prob = tf.constant([0.5, 0.1, 0.3, 0.1])
    signal_1_prob = tf.constant([[0.03, 0.97], [0.05, 0.95], [0.20, 0.80], [0.97, 0.03]])
    signal_2_prob = tf.constant([[0.03, 0.97], [0.97, 0.03], [0.97, 0.03], [0.99, 0.01]])

    state = ed.Categorical(probs=state_prob, name='state')
    signal_1 = ed.Categorical(probs=signal_1_prob[state], name='signal_1')
    signal_2 = ed.Categorical(probs=signal_2_prob[state], name='signal_2')

    return [state, signal_1, signal_2] # what does the function have to return? [state, signal_1, signal_2]?
然后得到联合对数概率函数

log_joint = ed.make_log_joint_fn(model) # joint log-probability function
可通过lambda表达式使用:

lambda x: log_joint(state=x, signal_1=1, signal_2=0)
我是否正确定义了模型

问题是我如何继续使用MCMC?对于这个离散模型,我可以使用哪种MCMC方法?有人能为我的模型显示MCMC代码吗?如何告诉MCMC算法仅从集合{0,1,2,3}中获取“状态”的样本


谢谢大家!

这个问题太容易还是太难?