你能“强迫”`scipy.stats.norm.rvs`输出正值吗?

时间:2016-08-25 00:53:47

标签: numpy random scipy statistics distribution

这可能是一个天真的问题,但我找不到任何有关它的帖子,所以我认为这可能有用。我找到了一个可以很好地适应我的数据的分布,但我的所有数据点在现实生活中都是积极的( - 那是不可能的)。

有没有办法强制.rvs只输出正值?

我想到了一些方法,但它们似乎非常耗费CPU,比如提供比我需要的更多的值,然后对所有正值和np.random.choice的值做一个布尔掩码。 有更好的方法吗?

我在文档中没有看到任何关于它的内容:/关于这个: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html

我发现这一点的短语没有产生任何结果: https://stackoverflow.com/search?q=force+scipy+rvs+positivehttps://stackoverflow.com/search?q=scipy+rvs+positive

params = (0.00169906712999, 0.00191866845411)
np.random.seed(0)
stats.norm.rvs(*params, size=10)
array([ 0.0050837 ,  0.00246684,  0.00357694,  0.0059986 ,  0.00528229,
       -0.00017601,  0.00352197,  0.00140866,  0.00150102,  0.00248687])

2 个答案:

答案 0 :(得分:3)

您似乎在寻找truncnorm:截断的正常连续随机变量。

例如,尝试:

>>> from scipy import stats
>>> import numpy as np
>>> np.random.seed(0)
>>> params = (0.00169906712999, 0.00191866845411)
>>> params[0] + stats.truncnorm.rvs(-params[0]/params[1], np.infty, size=10, scale=params[1])
array([ 0.00235414,  0.00310856,  0.00258259,  0.00233789,  0.00185298,
        0.00277454,  0.00190764,  0.00429671,  0.00532165,  0.00169576])

stats.truncnorm.rvs的前两个参数是截断限制。因为这些是针对 normal 分布计算的(均值= 0 std dev = 1),所以我们必须适当地缩放参数。

我们使用np.infty作为范围的上限,因为我们不希望在上方有任何截断。

验证没有输出为负

让我们看看超过100,000个样本的输出的最小值和最大值:

>>> np.random.seed(0)
>>> np.min(params[0] + stats.truncnorm.rvs(-params[0]/params[1], np.infty, size=100000, scale=params[1]))
1.9136656654716172e-08
>>> np.max(params[0] + stats.truncnorm.rvs(-params[0]/params[1], np.infty, size=10000, scale=params[1]))
0.0088294835649150548

正如您所看到的,最小值永远不会消极。最大值是高于平均值的几个标准差。

答案 1 :(得分:2)

取决于您希望保留的发行版的真实性。如果您只想要正值,那么它实际上并不是正态分布,因为您永远不会得到负值。

但是,您可以使用abs(output)强制增值,其中输出为numpy.ndarray