【问题标题】:effective sample size 2d array using arviz and pymc3 mcmc使用 arviz 和 pymc3 mcmc 的有效样本大小二维数组
【发布时间】:2020-07-16 11:51:34
【问题描述】:

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

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

ess = az.ess(samples)

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

样本将是一个 N x 2 数组,它应该只给出一个数字作为输出

谢谢!

【问题讨论】:

  • “它应该给出一个数字”:你确定吗? ESS 是特定于参数的。对于同一 MCMC 样本链中的不同模型参数,ESS 可能(非常)不同。
  • 啊,好吧,所以我想要每个参数有一个数字,我可以在样本数组的相关部分进行工作 1D ess - ace,谢谢!
  • @Lizardinablizzard 假设您有 N 从 2 个参数中提取,您可以在维度前添加 [None, ...] 或 np.expand_dims 以符合我在下面解释的约定
  • 另外,切向相关的问题,您是否使用 PyMC3 生成样本?如果是这样,你试过arviz.from_pymc3吗?
  • 我已经编写了自己的 mcmc 采样器,然后我将接受的 2D 采样点作为大小为 N x 2 的输出,所以也许我需要扩展 dims?

标签: python pymc3 mcmc arviz


【解决方案1】:

使用数组时,ArviZ 采用以下形状约定:

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

我不确定为什么 2d 案例不适合您,我怀疑这可能是由于没有足够的抽奖来计算 ess。

为确保您的尺寸得到正确解释,我建议您执行idata = az.convert_to_inference_data(ary),然后检查idata.posterior 以查看生成对象的尺寸。然后您可以致电az.ess(idata) 获取有效样本量。


编辑:如果我正确理解了您的 cmets,您将生成一个形状为 (draw=N, parameter_dim=2) 的数组,因为您只对单个链进行采样。由于这是一个二维数组,它将被解释为具有 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))

【讨论】:

  • 感谢@oriolabril,所以我认为我需要对我的样本进行转置才能将其转换为(链,绘制)格式,否则我会得到 NaN。但是现在我得到了 2.61 的答案,当我运行了一个具有 10000 个样本的合理值的 MCMC 链时,所以我期望更像是 4000?我可以看到,当我绘制它时,已经对参数空间进行了合理的探索。当我打印 idata.posterior 时,它说 chain 是 0、1,draw 是 0、....、9999,x 是样本值?
  • 您是否对两条链进行采样?或者你是用 2 个参数对 1 个链进行采样吗?如果没有一个最小的例子,很难猜测发生了什么,也许解释你是如何生成样本的可能会有所帮助,ArviZ 与大多数 Python PPL 库集成(参见arviz-devs.github.io/arviz/notebooks/InferenceDataCookbook.html),因此将数据转换为 ArviZ 可以理解的格式是关键过程的一部分
  • 如果您处于 1 链和 2 参数的情况,但加载到 ArviZ 生成 2 链和 1 参数,将 2.6 作为 ESS 并不意外,您会考虑将 2 参数作为同一个对象,其分布很可能是多模式的。 ArviZ 默认实现arxiv.org/pdf/1903.08008.pdf 中的算法,如第 4 页底部所述:“对于具有良好分离模式的多模态分布,split-̂R 调整导致 ESS 估计接近于发现的不同模式”
  • 我认为它是 2 个参数的 1 个链。在我的 mcmc 算法中,我从 2D 坐标开始,然后四处走动,如果移动被接受,则坐标存储在 N x 2 链中,直到 N 移动被接受。我正在尝试az.ess(az.convert_to_inference_data(np.transpose(samples))) 之类的东西,但现在我明白了为什么它会接近 2,虽然我不知道如何解决它,我会看看食谱,谢谢!
  • 太好了,谢谢@oriolabril!我现在得到两个不同的数字~400,但我想我实际上是针对一个数字,因为维度是相关的?我不认为只添加它们是正确的。我想我在样本点之间的 2D 空间中采用一些欧几里德距离,以使样本数组实际上是 1D,还是有更好的方法?编辑:啊,我想我需要阅读 arxiv 论文,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2023-01-25
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多