我正在尝试使用 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
,但我不知道如何为这个模型完成它。