mardi 5 décembre 2017

constrained random numbers sampling using python (Monte-Carlo, Markov chains, pymc)

I am trying to sample random numbers with constraints using Python and pymc library.

Here mins and maxes are arrays of minimums and maximums for each of 22 variables. It works fine in this case.

from pymc import *
X = Uniform('X', mins, maxes)
@potential
def s(X=X): 
 cons1 = X[0] < 225
 cons2 = X[0] > 405
 if cons1 or cons2:
     return -inf
 else:
     return 0.0
mc = MCMC([X, s])
mc.sample(10000)

However when I try to add one more constraint: that sum of variables must be equal to 1000, everything breaks:

from pymc import *
X = Uniform('X', mins, maxes)
@potential
def s(X=X): 
 cons1 = X[0] < 225
 cons2 = X[0] > 405
 cons3 = X.sum() >= 1000
 if cons1 or cons2 or cons3:
     return -inf
 else:
     return 0.0
mc = MCMC([X, s])
mc.sample(10000)

Error is: 'ZeroProbability: Potential s forbids its parents' current values'

Could you please recommend some solutions to this problem?




Aucun commentaire:

Enregistrer un commentaire