我有一个简单的贝叶斯网络:
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} 中抽取“状态”样本?
谢谢!