如何确定“冻结”的SciPy离散随机变量的支持?
如果我手动创建一个离散随机变量,使用的是 scipy.stats.rv_discrete
,我可以控制它的取值范围(也就是它可能得到的值)。这可以通过提供一个下限、一个上限和一个增量来实现(不过增量这个参数只在 测试过1),或者直接提供一个具体的 values
参数。
这个方法实际上并不是在构建一个随机变量,而是在构建一个离散的 分布,然后可以通过调用这个分布来得到一个随机变量。如果我有一个是通过给定具体的 values=
创建的分布生成的随机变量,我可以通过检查 rv.dist.xk
来确定它的取值范围(实际上,这还不够;如果 values=
中包含了零概率的值,我们还需要检查 rv.dist.xk
和 rv.dist.pk
,以排除那些零概率的值)。不过,这种方法对那些我们没有定义的、也不是通过 values=
方法定义的普通离散随机变量就不适用了。
有没有一种通用的方法可以返回离散随机变量的取值集合?一个单一的方法,可以适用于所有通过 rv_discrete
生成的离散随机变量,以及在 scipy.stats
模块中定义的,比如 randint
?
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=0
,scale=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))