如何确定“冻结”的SciPy离散随机变量的支持?

0 投票
1 回答
1009 浏览
提问于 2025-04-18 10:59

如果我手动创建一个离散随机变量,使用的是 scipy.stats.rv_discrete,我可以控制它的取值范围(也就是它可能得到的值)。这可以通过提供一个下限、一个上限和一个增量来实现(不过增量这个参数只在 测试过1),或者直接提供一个具体的 values 参数。

这个方法实际上并不是在构建一个随机变量,而是在构建一个离散的 分布,然后可以通过调用这个分布来得到一个随机变量。如果我有一个是通过给定具体的 values= 创建的分布生成的随机变量,我可以通过检查 rv.dist.xk 来确定它的取值范围(实际上,这还不够;如果 values= 中包含了零概率的值,我们还需要检查 rv.dist.xkrv.dist.pk,以排除那些零概率的值)。不过,这种方法对那些我们没有定义的、也不是通过 values= 方法定义的普通离散随机变量就不适用了。

有没有一种通用的方法可以返回离散随机变量的取值集合?一个单一的方法,可以适用于所有通过 rv_discrete 生成的离散随机变量,以及在 scipy.stats 模块中定义的,比如 randint

1 个回答

1

我们可以通过反向累积分布函数,也就是ppf,来获取分布的下限和上限,这个函数来自于scipy.stats库。

根据定义,ppf(0)会返回累积分布函数为零时的最大整数,所以下限实际上是这个值加1。

如果我没记错的话,代码并没有检查用户是否为一个离散分布添加了概率为零的事件,这种分布是用户通过(xk, pk)明确指定的。

>>> stats.binom.ppf([0, 1], 20, 0.4)
array([ -1.,  20.])

>>> stats.geom.ppf([0, 1], 0.4)
array([  0.,  inf])

>>> stats.hypergeom.ppf([0, 1], 20, 15, 10)
array([  4.,  10.])

>>> stats.bernoulli.ppf([0, 1], 0.5)
array([-1.,  1.])

这些分布有一个.a和一个.b属性,用来定义下限。不过,如果支持范围依赖于参数,它会显示最后一次调用时的范围。另外,这些是标准分布的范围,标准分布的loc=0scale=1适用于连续分布。

仅仅在你想熟悉实现细节,并且不介意寻找一些难以发现的错误时使用这个。这主要是供内部使用的。

>>> stats.hypergeom.ppf([0, 1], 20, 15, 10)
array([  4.,  10.])
>>> stats.hypergeom.a, stats.hypergeom.b
(5, array(10))

# WRONG, stale state ! 
>>> stats.hypergeom(20, 16, 10).dist.a, stats.hypergeom(20, 16, 10).dist.b   
(5, array(10))

>>> stats.hypergeom(20, 16, 10).ppf(0)
5.0
>>> stats.hypergeom(20, 16, 10).dist.a, stats.hypergeom(20, 16, 10).dist.b
(6, array(10))

撰写回答