Я генерирую случайное число, используя scipy stats. Я использовал распределение Пуассона. Ниже приведен пример:
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.
То, что вы хотите, можно назвать усеченным распределением Пуассона, за исключением того, что при общем использовании этого термина усечение происходит снизу, а не сверху (пример). Самый простой, даже если не всегда самый эффективный способ выборки усеченного распределения - удвоить размер запрашиваемого массива и сохранить только элементы, которые попадают в желаемый диапазон; если их недостаточно, удвойте размер и т.д. Как показано ниже:
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]
.
Я думаю, что решение довольно просто (если я правильно понял вашу проблему):
# 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.]