python - 张量流概率没有给出与 PyMC3 相同的结果
问题描述
我以前使用过 PyMC3,现在正在寻找使用 tensorflow 概率。
我在两者中都建立了一些模型,但不幸的是,我没有得到相同的答案。事实上,答案并没有那么接近。
# definition of the joint_log_prob to evaluate samples
def joint_log_prob(data, proposal):
prior = tfd.Normal(mu_0, sigma_0, name='prior')
likelihood = tfd.Normal(proposal, sigma, name='likelihood')
return (prior.log_prob(proposal) + tf.reduce_mean(likelihood.log_prob(data)))
proposal = 0
# define a closure on joint_log_prob
def unnormalized_log_posterior(proposal):
return joint_log_prob(data=observed, proposal=proposal)
# define how to propose state
rwm = tfp.mcmc.NoUTurnSampler(
target_log_prob_fn=unnormalized_log_posterior,
max_tree_depth = 100,
step_size = 0.1
)
# define initial state
initial_state = tf.constant(0., name='initial_state')
@tf.function
def run_chain(initial_state, num_results=7000, num_burnin_steps=2000,adaptation_steps = 1):
adaptive_kernel = tfp.mcmc.DualAveragingStepSizeAdaptation(
rwm, num_adaptation_steps=adaptation_steps,
step_size_setter_fn=lambda pkr, new_step_size: pkr._replace(step_size=new_step_size),
step_size_getter_fn=lambda pkr: pkr.step_size,
log_accept_prob_getter_fn=lambda pkr: pkr.log_accept_ratio,
)
return tfp.mcmc.sample_chain(
num_results=num_results,
num_burnin_steps= num_burnin_steps,
current_state=initial_state,
kernel=adaptive_kernel,
trace_fn=lambda cs, kr: kr)
trace, kernel_results = run_chain(initial_state)
我正在使用 NoUTurns 采样器,我添加了一些步长调整,没有它,结果几乎相同。
我真的不知道如何前进?
也许是联合对数概率是错误的?
解决方案
您应该在 log_prob 中使用 reduce_sum 而不是 reduce_mean。否则,您实际上是通过等于数据集大小的因子来降低可能性的权重。这会导致样本看起来更像之前的样本,这可能是您在图中看到的。
推荐阅读
- openshift - 如何将秘密链接到 OpenShift 模板中的默认管道 ServiceAccount?
- javascript - 为什么即使将超时设置为0,回调函数仍然延迟
- safari - 无法在 Safari 上设置远程视频描述发送参数,但在 Chrome 和 Firefox 中运行良好
- ios - 如何创建与已初始化的枚举一起使用的协议扩展?
- cuda - 在 GPU 上使用两个以上列表生成笛卡尔积
- excel - Excel宏需要很长时间
- python - 将字符串转换为类变量名
- forms - 在 ChipBuilder 中显示建议列表
- python - Rllib 离线 SAC 的数据准备
- jmeter - 对 quasar 项目的 UI 建议进行负载测试