gpt4 book ai didi

python - 具有伯努利分布的 TensorFlow Probability MCMC

转载 作者:行者123 更新时间:2023-12-01 00:15:23 24 4
gpt4 key购买 nike

我需要使用 TensorFlow Probability 从伯努利分布中采样来实现马尔可夫链蒙特卡罗。
但是,我的尝试显示的结果与我对伯努利分布的期望不一致。

我修改了 tfp.mcmc.sample_chain 文档中给出的示例(从对角线方差高斯采样)example here从伯努利分布中提取。由于伯努利分布是离散的,我使用了 RandomWalkMetropolis 转换内核而不是
Hamiltonian Monte Carlo kernel,我预计它不会工作,因为它计算梯度。

这是代码:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import tensorflow as tf
import tensorflow_probability as tfp
tfd = tfp.distributions

def make_likelihood(event_prob):
return tfd.Bernoulli(probs=event_prob,dtype=tf.float32)


dims=1
event_prob = 0.3
num_results = 30000
likelihood = make_likelihood(event_prob)


states, kernel_results = tfp.mcmc.sample_chain(
num_results=num_results,
current_state=tf.zeros(dims),
kernel = tfp.mcmc.RandomWalkMetropolis(
target_log_prob_fn=likelihood.log_prob,
new_state_fn=tfp.mcmc.random_walk_normal_fn(scale=1.0),
seed=124
),
num_burnin_steps=5000)

chain_vals = states

# Compute sample stats.
sample_mean = tf.reduce_mean(states, axis=0)
sample_var = tf.reduce_mean(
tf.squared_difference(states, sample_mean),
axis=0)

#initialize the variable
init_op = tf.global_variables_initializer()

#run the graph
with tf.Session() as sess:
sess.run(init_op)
[sample_mean_, sample_var_, chain_vals_] = sess.run([sample_mean,sample_var,chain_vals])

chain_samples = (chain_vals_[:] )
print ('Sample mean = {}'.format(sample_mean_))
print ('Sample var = {}'.format(sample_var_))
fig, axes = plt.subplots(2, 1)
fig.set_size_inches(12, 10)

axes[0].plot(chain_samples[:])
axes[0].title.set_text("values sample chain tfd.Bernoulli")
sns.kdeplot(chain_samples[:,0], ax=axes[1], shade=True)
axes[1].title.set_text("chain tfd.Bernoulli distribution")
fig.tight_layout()
plt.show()

我希望看到区间 [0,1] 中马尔可夫链状态的值。

马尔可夫链值的结果看起来不像伯努利分布的预期结果,KDE 图也不是,如图所示
在这个图中:

enter image description here

我的示例是否存在概念上的缺陷,或者在使用 TensorFlow Probability API 时是否存在错误?

或者马尔可夫链蒙特卡罗的TF.Probability实现是否可能存在问题
使用离散分布,例如伯努利分布?

最佳答案

我认为您的困惑体验的根源在于您仍在 RandomWalkMetropolis 中使用连续提案分布。过渡。 TensorFlow Probability 中整数分布(包括 Bernoulli)的约定是默认实现连续松弛。 IIRC,对于伯努利,那是 pdf(x) ~ p ** x * (1 - p) ** (1 - x) ;一次 x变为负数,这将稳步插入您的随机游走马尔可夫链走向 -inf ,正如你所观察到的。

您可以为此做几件事:

  • 使用通行证validate_args=TrueBernoulli构造函数。如果 x 会崩溃不是 0 或 1,可帮助您检测问题(但如果您想要区间 [0, 1] 中的非整数结果,请不要这样做)。
  • 使用不同的建议函数,例如 0 和 1 之间的独立统一。编写自己的函数并不难——下面是您使用的高斯漂移建议函数的代码:https://github.com/tensorflow/probability/blob/master/tensorflow_probability/python/mcmc/random_walk_metropolis.py#L97-L107 .请注意,提案需要对称才能与 RandomWalkMetropolis 一起正常工作.
  • 完全使用不同的 MCMC 转换运算符。

  • 我还提交了一张关于为独立提案制作 TransitionKernel 的票(例如我想象你可能需要的): https://github.com/tensorflow/probability/issues/218

    关于python - 具有伯努利分布的 TensorFlow Probability MCMC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122714/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com