使用arviz和pymc3 mcmc的有效样本大小2d阵列

2024-09-27 00:20:54 发布

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

我正在尝试使用pymc3和arviz获得2D mcmc链的有效样本量

import pymc3 as pm3
!pip install arviz 
import arviz as az

ess = az.ess(samples)

上面的代码适用于1D,但不适用于2D,我看到有一个az.convert_to_数据集可能会有所帮助,但我不知道如何使用它

Samples将是一个nx2数组,它应该只给出一个数字作为输出

谢谢


Tags: installpipto代码importconvertasaz
1条回答
网友
1楼 · 发布于 2024-09-27 00:20:54

使用阵列时,ArviZ采用以下形状约定:

  • 1d数组表示标量变量的单链的绘制:(draw,)
  • 2d数组表示标量变量的多个链的绘制:(chain, draw)
  • 3d+数组表示多个多维变量链的绘制:(chain, draw, *shape)

我不确定为什么2d案例对您不起作用,我怀疑可能是因为没有足够的绘图来计算ess

为了确保您的维度被正确解释,我建议执行^{},然后检查idata.posterior以查看生成对象的维度。然后可以调用az.ess(idata)以获取有效样本量


编辑:如果我正确理解了您的评论,您将生成一个具有形状(draw=N, parameter_dim=2)的数组,因为您仅对单个链进行采样。由于这是一个2d数组,它将被解释为具有N链和2绘图,这将打印一条关于链多于绘图的警告。您可以通过以下方式重塑阵列以匹配ArviZ约定:

idata = az.convert_to_inference_data(np.expand_dims(samples, 0))
# or what is the same (we just choose the name of the variable)
idata = az.from_dict({"position": np.expand_dims(samples, 0)})

它将生成一个(1, N, 2)数组,ArviZ将理解该数组的维度。我已经添加了对InferenceData的转换,因为使用InferenceData将允许您调用任何ArviZ函数,而无需再关心维度


如果数组为(2, N),则在扩展轴之前添加转置应该可以解决问题:

idata = az.convert_to_inference_data(np.expand_dims(samples.T, 0))

相关问题 更多 >

    热门问题