0

我最近开始使用 gpflow 来构建 GP 模型。我使用 Hamiltonian Monte Carlo 用一条链对后部进行采样。

我的目标是运行多个链并执行收敛诊断。

这是我为一条链设置的:

num_burnin_steps = ci_niter(100)
num_samples = ci_niter(500)


hmc_helper = gpflow.optimizers.SamplingHelper(
    model.log_posterior_density, model.trainable_parameters
)

hmc = tfp.mcmc.HamiltonianMonteCarlo(
    target_log_prob_fn=hmc_helper.target_log_prob_fn, num_leapfrog_steps=10, step_size=0.01
)

adaptive_hmc = tfp.mcmc.SimpleStepSizeAdaptation(
    hmc, num_adaptation_steps=10, target_accept_prob=f64(0.75), adaptation_rate=0.1
)


@tf.function
def run_chain_fn():
    return tfp.mcmc.sample_chain(
        num_results=num_samples,
        num_burnin_steps=num_burnin_steps,
        current_state=hmc_helper.current_state,
        kernel=adaptive_hmc,
        trace_fn=lambda _, pkr: pkr.inner_results.is_accepted,
    )

samples, _ = run_chain_fn()
constrained_samples = hmc_helper.convert_to_constrained_values(samples

我找不到任何关于如何为多个链修改它的示例。是我能找到的最接近的例子,它做同样的事情。Initial_state 更改为具有 10 个链。要对我的示例执行相同操作,我需要更改 hmc_helper.current_state 但无法找出正确的方法。

任何建议将不胜感激。

我是堆栈溢出的新手,如果我的问题不清楚,我深表歉意。

谢谢!

4

0 回答 0