skc
skc

Reputation: 11

Draw categorical vectors from pyMC3 with dirichlet prior

I want to draw categorical vectors where its prior is a product of Dirichlet distributions. The categories are fixed and each element in the categorical vector corresponds to a different Dirichlet prior. Here is a categorical vector of length 33 with 4 categories, setup with prior with a Dirichlet.

import pymc3 as pm

with pm.Model() as model3:
    theta = pm.Dirichlet(name='theta',a=np.ones((33,4)), shape=(33,4))
    seq = [pm.Categorical(name='seq_{}'.format(str(i)), p=theta[i,:], shape=(1,)) for i in range(33)]
    step1 = pm.Metropolis(vars=[theta])
    step2 = [pm.CategoricalGibbsMetropolis(vars=[i]) for i in seq]
    trace = pm.sample(50, step=[step1] + [i for i in step2])

However this approach is cumbersome as I have to do some array indexing to get the categorical vectors out. Are there better ways of doing this?

Upvotes: 1

Views: 469

Answers (1)

Elenchus
Elenchus

Reputation: 195

You don't need to specify the shape. Note that the way you've set it up there are 33 different categorical variables; I'm assuming that's what you've intended. Here's the easier way to do that:

with pm.Model() as model: 
    theta = pm.Dirichlet(name='theta',a=np.ones(4)) 
    children = [pm.Categorical(f"seq_{i}", p=theta) for i in range(33)] 

Upvotes: 0

Related Questions