【问题标题】:Unable to create lambda function in hierarchical pymc3 model无法在分层 pymc3 模型中创建 lambda 函数
【发布时间】:2015-03-04 02:01:40
【问题描述】:

我正在尝试使用 PyMC 3 创建如下所示的模型,但无法弄清楚如何使用 lambda 函数将概率正确映射到观察到的数据。

import numpy as np
import pymc as pm

data = np.array([[0, 0, 1, 1, 2],
                 [0, 1, 2, 2, 2],
                 [2, 2, 1, 1, 0],
                 [1, 1, 2, 0, 1]])
(D, W) = data.shape
V = len(set(data.ravel()))
T = 3
a = np.ones(T)
b = np.ones(V)

with pm.Model() as model:
    theta = [pm.Dirichlet('theta_%s' % i, a, shape=T) for i in range(D)]
    z = [pm.Categorical('z_%i' % i, theta[i], shape=W) for i in range(D)]
    phi = [pm.Dirichlet('phi_%i' % i, b, shape=V) for i in range(T)]
    w = [pm.Categorical('w_%i_%i' % (i, j),
                        p=lambda z=z[i][j], phi_=phi: phi_[z], # Error is here
                        observed=data[i, j])
            for i in range(D) for j in range(W)]

我得到的错误是

AttributeError: 'function' object has no attribute 'shape'

在我尝试构建的模型中,z 的元素指示phi 中的哪个元素给出了data 中相应观察值的概率(放置在 RV w 中)。换句话说,

P(data[i,j]) <- phi[z[i,j]][data[i,j]]

我猜我需要使用 Theano 表达式定义概率或使用 Theano as_op,但我不知道如何为这个模型完成。

【问题讨论】:

  • 你能解决这个问题吗?

标签: theano pymc3


【解决方案1】:

您应该将您的分类p 值指定为Deterministic 对象,然后再将它们传递给w。否则,as_op 实现将如下所示:

@theano.compile.ops.as_op(itypes=[t.lscalar, t.dscalar, t.dscalar],otypes=[t.dvector])
def p(z=z, phi=phi):
    return [phi[z[i,j]] for i in range(D) for j in range(W)]

【讨论】:

  • 我为我的模型修复了itypes 列表,但我仍然得到'list' object has no attribute 'type',因为phi 是一个列表。我可以将z 的一个元素(也是一个列表)传递给as_op 函数,但我需要phi 作为一个列表参数,以便我可以在z 上对其进行索引。看来我可以使用 ContainerIndex 对象来完成此操作,但 PyMC 3 中不存在这些类。使用 Deterministic 似乎会遇到同样的问题,因为我仍然需要索引phiz RV 列表。
  • 只是好奇这个问题是否已经解决。我在这里遇到了类似的麻烦......希望我不必切换回 PyMC2
  • pymc3 现在有一个Deterministic。请参阅存储库中的示例文件夹,以及 disaster_model_arbitrary_deterministic.py 中所示的 as_op 装饰器。
  • 是的,我明白了,但问题仍然是我期待将任意大小的 pymc3 变量列表传递给as_op....dvector 无法按他们的要求工作“Theano 列表”,但我无法创建 pymc3 变量的“Theano 列表”。
  • 在 Theano 中操作向量并非易事,因为它通常需要使用 scan,这不是很直观。
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2020-10-29
  • 2020-03-27
  • 2023-01-31
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多