Search code examples
pythontheanopymcpymc3

PyMC3: PositiveDefiniteError when sampling a Categorical variable


I am trying to sample a simple model of a categorical distribution with a Dirichlet prior. Here is my code:

import numpy as np
from scipy import optimize
from pymc3 import *

k = 6
alpha = 0.1 * np.ones(k)

with Model() as model:
    p = Dirichlet('p', a=alpha, shape=k)
    categ = Categorical('categ', p=p, shape=1)

    tr = sample(10000)

And I get this error:

PositiveDefiniteError: Scaling is not positive definite. Simple check failed. Diagonal contains negatives. Check indexes [0 1 2 3 4]

Solution

  • The problem is that NUTS is failing to initialize properly. One solution is to use another sampler like this:

    with pm.Model() as model:
        p = pm.Dirichlet('p', a=alpha)
        categ = pm.Categorical('categ', p=p)
    
        step = pm.Metropolis(vars=p)
        tr = pm.sample(1000, step=step)
    

    Here I am manually assigning p to Metropolis, and letting PyMC3 assign categ to a proper sampler.