2016-11-11 1 views
1

J'essaie d'échantillonner un modèle simple d'une distribution catégorielle avec un avant Dirichlet. Voici mon code:PyMC3: PositiveDefiniteError lors de l'échantillonnage d'une variable catégorielle

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) 

Et je reçois cette erreur:

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

Répondre

1

Le problème est que NUTS omet d'initialiser correctement. Une solution consiste à utiliser un autre sampler comme ceci:

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) 

Ici, je suis attribuer manuellement p à Metropolis, et de laisser PyMC3 assigner categ à un échantillonneur approprié.