基于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}中获取“状态”的样本
谢谢大家! 这个问题太容易还是太难?