首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于arviz和pymc3 mcmc的有效样本大小2d阵列

基于arviz和pymc3 mcmc的有效样本大小2d阵列
EN

Stack Overflow用户
提问于 2020-07-16 11:51:34
回答 1查看 675关注 0票数 1

我试着用pymc3和arviz获得二维mcmc链的有效样本大小。

代码语言:javascript
复制
import pymc3 as pm3
!pip install arviz 
import arviz as az

ess = az.ess(samples)

上面的代码适用于1D,而不是2D,我看到有一个az.convert_to_dataset可能有用,但我不知道如何使用它?

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-18 02:55:22

在处理数组时,ArviZ采用以下形状约定:

(draw,)

  • 2d数组表示标量变量的单链的绘制:(chain, draw)

  • 3d+数组表示标量变量的多个链的绘制:(chain, draw)

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

我不知道为什么2d的情况不适合你,我怀疑这可能是因为没有足够的平局来计算ess

为了确保您的维度被正确地解释,我建议执行idata = az.convert_to_inference_data(ary),然后检查idata.posterior以查看生成对象的维度。然后,您可以调用az.ess(idata)来获得有效的样本大小。

编辑:如果我正确理解了您的注释,您将生成一个具有(draw=N, parameter_dim=2)形状的数组,因为您只是对一个单链进行采样。因为这是一个2d数组,所以它将被解释为有N链和2绘图,这应该会打印一个有更多链的警告。您可以通过以下方式重新构造数组以匹配ArviZ约定:

代码语言:javascript
复制
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),那么在展开轴之前添加转置应该可以解决这个问题:

代码语言:javascript
复制
idata = az.convert_to_inference_data(np.expand_dims(samples.T, 0))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62934085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档