使用python进行约束随机数采样(Monte-Carlo,Markov链,pymc)

时间:2017-12-05 11:27:27

标签: python python-3.x random pymc mcmc

我正在尝试使用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)

错误是:&#39; ZeroProbability:潜在的s禁止其父母&#39;当前值&#39;

你能否为这个问题推荐一些解决方案?

1 个答案:

答案 0 :(得分:0)

考虑在标准区间内仅从两个受约束的均匀随机变量中进行采样,如此处所示。

棕色区域表示基于一些不等式的约束采样区域。对角线代表总和。

注意:在2空格中,棕色区域有一个区域(也称为概率或度量),但对角线有区域,也就是说零概率或度量。

对于更高维度的空间也是如此。

two random variables