【问题标题】:Scipy poisson distribution with an upper limit具有上限的 Scipy 泊松分布
【发布时间】:2018-09-19 05:45:55
【问题描述】:

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

【问题讨论】:

  • 你无法控制随机数的分布,除非你得到数组后手动更改数字,这是微不足道的。否则,您可能需要查看其他受限的发行版,例如 beta。

标签: python scipy statistics poisson


【解决方案1】:

我认为解决方案很简单(假设我正确理解了您的问题):

# 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,感谢您的建议,很抱歉我的回复晚了
【解决方案2】:

您想要的可以称为截断泊松分布,除了在该术语的常见用法中,截断发生在下方而不是上方 (example)。对截断分布进行采样的最简单(即使并非总是最有效)方法是将请求的数组大小加倍并仅保留落在所需范围内的元素;如果不够,再加倍大小等。如下图:

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]

【讨论】:

  • 亲爱的,感谢您的建议,很抱歉回复晚了。我认为这个功能更有效,更适合我的应用程序。因为我在数据框中使用它。
  • 嗨@Welcome to Stack,我在 Pandas 数据框中使用了这个函数,它向我显示了以下错误:ValueError:大小与参数的广播形状不匹配。数据框包含 10 行和 13 列。我正在尝试创建一个使用 truncated_Poisson 函数的新列。我该怎么做?下面是新列 UCL_Fix_Dub ['Team1_goals'] = truncated_Poisson(UCL_Fix_Dub.Team1_XG,max_goal,1) 的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多