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

时间:2015-02-27 02:26:11

标签: 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 = 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 {{ 1}})。换句话说,

w

我猜我需要用Theano表达式定义概率或使用Theano P(data[i,j]) <- phi[z[i,j]][data[i,j]] ,但我不知道如何为此模型做到这一点。

1 个答案:

答案 0 :(得分:2)

您应将分类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)]