python - 在python中生成截断的负二项分布

标签 python probability-distribution

我正在尝试生成遵循由数字组成的截断负二项分布的数据集,使得数字集具有最大值。

def truncated_Nbinom(n, p, max_value, size):
    import scipy.stats as sct
    temp_size = size
    while True:
        temp_size *= 2
        temp = sct.nbinom.rvs(n, p, size=temp_size)
        truncated = temp[temp <= max_value]
        if len(truncated) >= size:
            return truncated[:size]

当 max_value 和 n 较小时,我能够得到结果。但是,当我尝试使用时:

input_1= truncated_Nbinom(99, 0.3, 99, 5000).tolist()

内核不断消亡。我试图更改 python 的端口并提高递归限制,但它们没有用。你有什么想法可以让我的代码更快吗?

最佳答案

这是一种方法。您可以计算 x 在负二项式下被选中的概率,然后将低于 max_valuex 的概率归一化为一。现在,您只需以适当的概率调用 np.random.choice

import numpy as np
import pandas as pd
from scipy import stats


def truncated_Nbinom2(n, p, max_value, size):
  support = np.arange(max_value + 1)
  probs = stats.nbinom.pmf(support, n, p)
  probs /= probs.sum()
  return np.random.choice(support, size=size, p=probs)

这是一个例子:

arr1 = truncated_Nbinom(9, 0.3, 9, 50000)
arr2 = truncated_Nbinom2(9, 0.3, 9, 50000)

df_counts = pd.DataFrame({
    "version_1": pd.Series(arr1).value_counts(),
    "version_2": pd.Series(arr2).value_counts(),
})

enter image description here

关于python - 在python中生成截断的负二项分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67601496/

相关文章:

python - Pandas:如何迭代第一级并从第二级随机选择,然后将子选择添加到数据帧

python - 如何比较 csv 中的这些数据集? Python 2.7

python - 如何为数据列表找到最合适的分布函数?

anylogic - 如何从数据库中读取概率分布并将它们保存在集合中

python - 让敌人射击玩家

python - 复杂的 pandas 子设置;选择与多列中的条件匹配的行

python - 如何设置 XZ 文件的 tarfile 的压缩级别?

python - scipy 的 stats.rv_discrete 模块中 'sum pk not equal to 1' 错误的解决方法

r - 如何使用不同(但固定)均值最大化联合似然函数

performance - 如何生成随机 "enough"的随机整数?