Theano 无法在分层pymc3模型中创建lambda函数

Theano 无法在分层pymc3模型中创建lambda函数,theano,pymc3,Theano,Pymc3,我试图用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 = l

我试图用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
中的哪个元素给出了
数据中相应观察值的概率(放置在RV
w
)。换句话说,

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

P(数据[i,j])

在将其传递给

w
之前,您应该将您的分类
P
值指定为
Deterministic
对象。否则,
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'对象没有属性'type'
,因为
phi
是一个列表。我可以将
z
的元素(它也是一个列表)传递给
as_op
函数,但我需要
phi
作为列表参数,这样我就可以在
z
上对其进行索引。似乎我可以使用
容器
索引
对象来实现这一点,但这些类在pymc3中不存在。使用
Deterministic
似乎也会有同样的问题,因为我仍然需要用
z
RV为
phi
列表编制索引。只是好奇这是否已经解决了。我在这里遇到了一些类似的问题…希望我不必切换回PYMC2现在pymc3中有一个
确定性的
。请参阅存储库中的示例文件夹,以及
灾难模型任意确定性.py中所示的
as_op
装饰器。是的,我看到了,但问题仍然是我希望将任意大小的pymc3变量列表传递给
,因为_op
dvector
无法工作,因为它们需要“Theano list”,但我无法创建pymc3变量的“Theano list”。在Theano中操作向量非常重要,因为它通常需要使用
扫描
,这不是很直观。你能解决这个问题吗?