鉴于"冷冻" SciPy离散随机变量,我怎么知道它的支持?

时间:2014-06-25 06:31:51

标签: python random scipy

如果我使用scipy.stats.rv_discrete手动创建离散随机变量,我可以通过提供下限,上限和增量来控制其支持(它可以获得的可能值)(尽管后者是{ {3}}),或提供具体的values参数。

这些方法实际上并不构造一个随机变量,而是构造一个离散的分布,通过调用它可以构造一个随机变量。给定一个随机变量,它是通过以这种方式给出具体的values=构造的分布构造的,我可以通过检查rv.dist.xk找出它的支持(事实上,这还不够;如果values=包含零概率,我们应该检查rv.dist.xkrv.dist.pk以从支持中丢弃零概率值。但是,这种方法不适用于我们尚未定义且未使用values=方法定义的一般离散随机变量。

是否有一般方法可以返回离散随机变量的支持集? 单一方法,适用于使用rv_discrete scipy.stats模块中定义的所有离散随机变量生成的所有离散随机变量,例如{ {1}}?

1 个答案:

答案 0 :(得分:1)

我们可以从scipy.stats.distribution的反向cdf,ppf获得分布支持的下限和上限。

根据定义,ppf(0)返回cdf为零的最大整数,因此下限大于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))