Как смоделировать переменную с фиксированным интервалом? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь смоделировать производительность реального жизненного процесса.Переменные, которые были измерены исторически, показывают фиксированный интервал, поэтому он был ниже или больше того, что эти значения физически невозможны.

Чтобы смоделировать выходные данные процесса, исторические данные каждой входной переменной были представлены как распределение вероятностей наилучшего соответствия,соответственно (при использовании этого подхода: Подгонка эмпирического распределения к теоретическому с помощью Scipy (Python)? ).

Однако полученное теоретическое распределение при моделировании n раз не представляет реальную жизньожидаемые минимальные и максимальные значения.Я думаю применить тест-исключение для каждого моделирования, чтобы проверить, находится ли каждое моделируемое значение между ожидаемым интервалом, но я не уверен, что это лучший способ справиться с этим из-за того, что экспериментальное среднее и дисперсия не достигнуты.

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете использовать логическую маску в 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
...