【问题标题】:constrained random numbers sampling using python (Monte-Carlo, Markov chains, pymc)使用 python 进行约束随机数采样(蒙特卡洛、马尔可夫链、pymc)
【发布时间】: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


【解决方案1】:

考虑在标准区间上仅从两个受约束的均匀随机变量中抽样,如图所示。

棕色区域表示基于某些不等式的受限采样区域。对角线表示总和。

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

对于高维空间也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 2016-02-09
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多