Pymc3 中的分类混合模型
Categorical Mixture Model in Pymc3
我是 Pymc3 的新手,我正在尝试创建 https://en.wikipedia.org/wiki/Mixture_model#Categorical_mixture_model 中所示的分类混合模型。我很难连接 'x' 变量。我认为这是因为我必须使 z 变量具有确定性,但我在分配 'x' 的行收到一条错误消息:"ValueError: We expected 3 inputs but got 2."。看起来 p 函数只接受 2 个输入,所以我被卡住了。我已经尝试了很多不同的东西,但还没能让它发挥作用。
import numpy as np
from pymc3 import *
import theano.tensor as t
K = 3 #NUMBER OF TOPICS
V = 20 #NUMBER OF WORDS
N = 15 #NUMBER OF DOCUMENTS
#GENERAETE RANDOM CATEGORICAL MIXTURES
data = np.ones([N,V])
@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)]
model = Model()
with model:
alpha = np.ones(V)
beta = np.ones(K)
theta = [Dirichlet('theta_%i' % i, alpha, shape=V) for i in range(K)]
phi = Dirichlet('phi', beta, shape=K)
z = [Categorical('z_%i' % i, p = phi, shape=V) for i in range(N)]
x = [Categorical('x_%i_%i' % (i,j), p=p(z[i][j],phi), observed=data[i,j]) for i in range(N) for j in range(V)]
#x = [Categorical('x_%i_%i' % (i,j), p=theta[z[i][j]], observed=data[i,j]) for i in range(N) for j in range(V)]
print "Created model. Now begin sampling"
step = Slice()
trace = sample(n, step)
trace.get_values('phi')
首先,在您上面的示例中,z 和 phi 没有允许将它们用作默认值的值。我们也没有 D 和 W 的值。
至于参数个数,你定义的函数有2个,但是你上面的theano装饰器有3个。我建议
@theano.compile.ops.as_op(itypes=[t.lscalar, t.dvector],otypes=[t.dvector])
def p(z, phi):
return [phi[z[i,j]] for i,j in zip(range(D),range(W))]
我是 Pymc3 的新手,我正在尝试创建 https://en.wikipedia.org/wiki/Mixture_model#Categorical_mixture_model 中所示的分类混合模型。我很难连接 'x' 变量。我认为这是因为我必须使 z 变量具有确定性,但我在分配 'x' 的行收到一条错误消息:"ValueError: We expected 3 inputs but got 2."。看起来 p 函数只接受 2 个输入,所以我被卡住了。我已经尝试了很多不同的东西,但还没能让它发挥作用。
import numpy as np
from pymc3 import *
import theano.tensor as t
K = 3 #NUMBER OF TOPICS
V = 20 #NUMBER OF WORDS
N = 15 #NUMBER OF DOCUMENTS
#GENERAETE RANDOM CATEGORICAL MIXTURES
data = np.ones([N,V])
@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)]
model = Model()
with model:
alpha = np.ones(V)
beta = np.ones(K)
theta = [Dirichlet('theta_%i' % i, alpha, shape=V) for i in range(K)]
phi = Dirichlet('phi', beta, shape=K)
z = [Categorical('z_%i' % i, p = phi, shape=V) for i in range(N)]
x = [Categorical('x_%i_%i' % (i,j), p=p(z[i][j],phi), observed=data[i,j]) for i in range(N) for j in range(V)]
#x = [Categorical('x_%i_%i' % (i,j), p=theta[z[i][j]], observed=data[i,j]) for i in range(N) for j in range(V)]
print "Created model. Now begin sampling"
step = Slice()
trace = sample(n, step)
trace.get_values('phi')
首先,在您上面的示例中,z 和 phi 没有允许将它们用作默认值的值。我们也没有 D 和 W 的值。
至于参数个数,你定义的函数有2个,但是你上面的theano装饰器有3个。我建议
@theano.compile.ops.as_op(itypes=[t.lscalar, t.dvector],otypes=[t.dvector])
def p(z, phi):
return [phi[z[i,j]] for i,j in zip(range(D),range(W))]