4

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

        state
      /       \
     /         \
    V           V  
signal_1    signal_2

随机变量“state”、“signal_1”和“signal_2”具有相应的离散值:Val(state) = {0, 1, 2, 3}, Val(signal_1) = {0, 1} 和 Val(signal_2 ) = {0, 1}。

我有边际概率分布 P(state) 和条件概率分布 P(signal_1|state) 和 P(signal_2|state) 作为表格。

联合概率 P(state, signal_1, signal_2) 等于 P(state) * P(signal_1|state) * P(signal_2|state) 和 log P(state, signal_1, signal_2) = log P(state) + log P (signal_1|state) + log P(signal_2|state)。

我正在尝试在 TensorFlow Probability 中构建此模型:

变体 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)

我的证据是,例如,“signal_1 = 1”和“signal_2 = 0”,我想得到“state = 0”的概率,即 P(state=0|signal_1=1, signal_2=0)

我定义函数:

def unnormalized_log_posterior(state):
    return joint_log_prob(state, 1, 0)

通过 Edward2 的变体 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} 中抽取“状态”样本?

谢谢!

4

0 回答 0