2015-08-28 8 views
1

Я новичок в Pymc3, и я пытаюсь создать модель категорной смеси, показанную в https://en.wikipedia.org/wiki/Mixture_model#Categorical_mixture_model. Мне трудно подключить переменную «x». Я думаю, это потому, что я должен сделать переменную z детерминированной, но я получаю сообщение об ошибке в строке, где назначается «x»: «ValueError: мы ожидали 3 входа, но получили 2.». Похоже, функция p принимает только 2 входа, поэтому я застрял. Я пробовал кучу разных вещей, но пока не смог заставить это работать.Модель категорной смеси в Pymc3

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') 

ответ

0

Для начала, в приведенном выше примере, 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))]