Scipy泊松分布与上限

7

我使用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中使用它。

1
除非您在获取数组后手动更改数字(这很简单),否则无法控制随机数分布。否则,您可能需要研究其他受限制的分布,例如贝塔分布。 - user2974951
2个回答

8
我认为解决方案很简单(假设我正确理解了您的问题):
# 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.]

亲爱的AGN,感谢您的建议,抱歉我回复晚了。 - Zephyr
想知道为什么这个方法在多次运行时会产生相似的随机数序列(即使没有 np.random.seed(0))? - mdslt
我将np.random.seed(0)这一行注释掉,重新运行了我的答案中的整个代码,得到了不同的序列。我无法重现你的问题。也许你可以提供更详细的描述,说明你是如何运行代码的? - AGN Gazer
1
这个应该被采纳为答案。它更高效,而且使用了分位数和基本度量标准,这将帮助程序员更好地理解未来的数学。 - Josh Albert

3
您所需要的可以称为“截断泊松分布”,但是在这个术语的常见用法中,截断是从下面而不是从上面发生的(例如,请参见示例)。抽样截断分布最简单的方法,即使不总是最有效的方法,是将请求的数组大小加倍,并仅保留落在所需范围内的元素;如果不足,则再次加倍大小,以此类推。如下所示:
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]


亲爱的,感谢您的建议,很抱歉回复晚了。我认为这个函数可以工作并且更适合我的应用程序,因为我正在使用它在数据框中。 - Zephyr
嗨@欢迎来到Stack,我在Pandas数据框中使用了这个函数,然后出现了以下错误: ValueError: size does not match the broadcast shape of the parameters.数据框包含10行和13列。我想要创建一个新的列,使用了truncated_Poisson函数。 我应该如何做呢? 下面是创建新列的代码: UCL_Fix_Dub ['Team1_goals'] = truncated_Poisson(UCL_Fix_Dub.Team1_XG,max_goal,1) - Zephyr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接