首页 > 解决方案 > 张量流概率没有给出与 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)

这是使用 PyMC3 和 TFP 的后验

我正在使用 NoUTurns 采样器,我添加了一些步长调整,没有它,结果几乎相同。

我真的不知道如何前进?

也许是联合对数概率是错误的?

标签: pythonbayesianpymc3tensorflow-probability

解决方案


您应该在 log_prob 中使用 reduce_sum 而不是 reduce_mean。否则,您实际上是通过等于数据集大小的因子来降低可能性的权重。这会导致样本看起来更像之前的样本,这可能是您在图中看到的。


推荐阅读