如何模拟固定间隔的变量?

时间:2019-02-23 22:36:03

标签: python scipy statistics simulation montecarlo

我正在尝试模拟现实生活过程的表现。历史上已测量的变量显示固定的间隔,因此值越小越好,以至于这些值在物理上是不可能的。

为模拟过程输出,每个输入变量历史数据分别表示为最佳拟合概率分布(使用这种方法:Fitting empirical distribution to theoretical ones with Scipy (Python)?)。

但是,当模拟n次时所得的理论分布并不代表实际的预期最小和最大值。我正在考虑对每个模拟应用“试一试”测试,以检查每个模拟值是否在预期间隔之间,但是由于未达到实验均值和方差,因此我不确定这是否是处理此问题的最佳方法。 / p>

1 个答案:

答案 0 :(得分:1)

您可以在numpy中使用布尔掩码,以重新生成超出所需边界的值。例如:

def random_with_bounds(func, size, bounds):
    x = func(size=size)
    r = (x < bounds[0]) | (x > bounds[1])
    while r.any():
        x[r] = func(size=r.sum())
        r[r] = (x[r] < bounds[0]) | (x[r] > bounds[1])
    return x

然后您可以像使用它一样

random_with_bounds(np.random.normal, 1000, (-1, 1))

另一种通过np.argwhere使用索引数组的版本会稍微提高性能:

def random_with_bounds_2(func, size, bounds):
    x = func(size=size)
    r = np.argwhere((x < bounds[0]) | (x > bounds[1])).ravel()
    while r.size > 0:
        x[r] = func(size=r.size)
        r = r[(x[r] < bounds[0]) | (x[r] > bounds[1])]
    return x