Распределение Пуассона Scipy с верхним пределом

Я генерирую случайное число, используя статистику scipy. Я использовал распределение Пуассона. Ниже приведен пример:

import scipy.stats as sct

A =2.5
Pos = sct.poisson.rvs(A,size = 20)

Когда я печатаю Pos, я получаю следующие числа:

array([1, 3, 2, 3, 1, 2, 1, 2, 2, 3, 6, 0, 0, 4, 0, 1, 1, 3, 1, 5])

Из массива видно, что некоторые числа, например 6, сгенерированы.

Что я хочу сделать, чтобы ограничить наибольшее число (скажем, 5), то есть любое случайное число, сгенерированное с использованием sct.poisson.rvs, должно быть равно или меньше 5,

Как я могу настроить свой код, чтобы добиться этого. Кстати, я использую это в Pandas Dataframe.


person Zephyr    schedule 19.09.2018    source источник
comment
Вы не можете контролировать распределение случайных чисел, если только вы не измените числа вручную после получения массива, что тривиально. В противном случае вы можете захотеть изучить другие ограниченные дистрибутивы, например бета-версию.   -  person user2974951    schedule 19.09.2018


Ответы (2)


То, что вам нужно, можно было бы назвать усеченным распределением Пуассона, за исключением того, что в обычном использовании этого термина усечение происходит снизу, а не сверху (пример). Самый простой, даже если не всегда самый эффективный способ выборки усеченного распределения — удвоить требуемый размер массива и оставить только те элементы, которые попадают в желаемый диапазон; если их недостаточно, снова удвойте размер и т. д. Как показано ниже:

import scipy.stats as sct

def truncated_Poisson(mu, max_value, size):
    temp_size = size
    while True:
        temp_size *= 2
        temp = sct.poisson.rvs(mu, size=temp_size)
        truncated = temp[temp <= max_value]
        if len(truncated) >= size:
            return truncated[:size]

mu = 2.5
max_value = 5
print(truncated_Poisson(mu, max_value, 20))

Типичный вывод: [0 1 4 5 0 2 3 2 2 2 5 2 3 3 3 3 4 1 0 3].

person Community    schedule 19.09.2018
comment
Уважаемый, спасибо за совет и извините за поздний ответ. Я думаю, что эта функция работает и лучше подходит для моего приложения, потому что я использую ее в кадре данных. - person Zephyr; 24.09.2018
comment
Привет, @Welcome to Stack, я использовал эту функцию во фрейме данных Pandas, и она показала мне следующую ошибку: ValueError: size не соответствует широковещательной форме параметров. кадр данных содержит 10 строк и 13 столбцов. Я пытаюсь создать новый столбец, в котором используется функция truncated_Poisson. Как бы я это сделал? Ниже приведен код для нового столбца UCL_Fix_Dub ['Team1_goals'] = truncated_Poisson(UCL_Fix_Dub.Team1_XG,max_goal,1) - person Zephyr; 24.09.2018

Я думаю, что решение довольно простое (при условии, что я правильно понял вашу проблему):

# for repeatability:
import numpy as np
np.random.seed(0)

from scipy.stats import poisson, uniform
sample_size = 20
maxval = 5
mu = 2.5

cutoff = poisson.cdf(maxval, mu)
# generate uniform distribution [0,cutoff):
u = uniform.rvs(scale=cutoff, size= sample_size)
# convert to Poisson:
truncated_poisson = poisson.ppf(u, mu)

Затем print(truncated_poisson):

[2. 3. 3. 2. 2. 3. 2. 4. 5. 2. 4. 2. 3. 4. 0. 1. 0. 4. 3. 4.]
person AGN Gazer    schedule 19.09.2018
comment
Уважаемый AGN, Спасибо за совет и извините за мой поздний ответ. - person Zephyr; 24.09.2018