python - 使用给定的概率密度函数生成随机数

标签 python numpy scipy probability

我想指定 probability density function一个分布,然后在 Python 中从该分布中选取 N 个随机数。我该怎么做?

最佳答案

一般来说,您想要逆累积概率密度函数。一旦你有了它,那么沿着分布生成随机数就很简单了:

import random

def sample(n):
    return [ icdf(random.random()) for _ in range(n) ]

或者,如果您使用 NumPy:

import numpy as np

def sample(n):
    return icdf(np.random.random(n))

在这两种情况下,icdf 都是逆累积分布函数,它接受 0 到 1 之间的值,并根据分布输出相应的值。

为了说明icdf 的性质,我们将以值 10 和 12 之间的简单均匀分布为例:

  • 概率分布函数在 10 到 12 之间为 0.5,其他地方为零

  • 累积分布函数在 10 以下为 0(没有低于 10 的样本),在 12 以上为 1(没有样本超过 12)并且在值之间线性增加(PDF 的积分)

  • 逆累积分布函数只定义在 0 和 1 之间。0 时为 10,12 时为 1,并且在值之间呈线性变化

当然,困难的部分是获得逆累积密度函数。这真的取决于你的分布,有时你可能有一个分析函数,有时你可能想求助于插值。数值方法可能会有用,因为数值积分可用于创建 CDF,插值可用于反转它。

关于python - 使用给定的概率密度函数生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471457/

相关文章:

python - 导入错误 : no module named dns. 查询

python - yolov3 中的 CNN 实际层数是多少?

python - 如何仅编辑一个数据帧pandas的显示精度

python - 矩阵翻转水平或垂直

python - 如何使用 Excel 等函数修改 numpy 数组

python - 多维点的几何中值

python-3.x - LU 分解速度与传统 Ax=b 的比较

python - 如何使用 Sphinx apidoc 仅记录在 __init__.py 中导入的 Python 类?

numpy - 色相饱和度直方图

python - numpy:使用更多观察值更新最小二乘法的代码