张量流概率与PyMC3结果不一致

2024-04-18 19:41:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前用过PyMC3,现在想用张量流概率。你知道吗

我已经建立了一些模型,但不幸的是,我没有得到相同的答案。事实上,答案并不是那么接近。你知道吗

    # 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)

This is the posterior using PyMC3 and TFP

我使用NoUTurns采样器,我添加了一些步长调整,没有它,结果几乎是一样的。你知道吗

我真的不知道如何前进?你知道吗

也许是联合对数概率错了?你知道吗


Tags: lambdalogsizestepstepskernelresultsnum
1条回答
网友
1楼 · 发布于 2024-04-18 19:41:59

你应该在日志中使用reduce\u sum而不是reduce\u mean。否则,您将通过与数据集大小相等的因子来有效地降低可能性。这将导致样本看起来更像先前的,这可能是您在绘图中看到的。你知道吗

相关问题 更多 >