【发布时间】:2017-12-05 11:27:26
【问题描述】:
我正在尝试使用 Python 和 pymc 库对带有约束的随机数进行抽样。
这里的 mins 和 maxes 是 22 个变量中每个变量的最小值和最大值的数组。在这种情况下它工作正常。
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)
但是,当我尝试再添加一个约束:变量的总和必须等于 1000 时,一切都会中断:
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)
错误是:'ZeroProbability: Potential s forbids its parents' current values'
你能推荐一些解决这个问题的方法吗?
【问题讨论】:
-
看起来您的约束可能不兼容,即不存在满足它们的变量值。这些最小值和最大值是多少?
-
有什么理由不使用
random.randint(min, max)? -
Andrei、mins 和 maxes 是每个变量的区间。约束是兼容的:我至少有一个手工计算的解决方案。 (但种类繁多)但是我需要获得更多分布均匀的样本。
-
Piinthesky,我需要生成具有分组约束的随机数,即 x1+x2+x3 = 300; x1+x2+x3 +x4+...+xn == 1000;
-
随机生成
x3并在此约束下随机生成另一个xi?或者生成随机 n 元组并丢弃,如果它们违反任何约束?
标签: python python-3.x random pymc mcmc