你能 "force" `scipy.stats.norm.rvs` 输出正值吗?
Can you "force" `scipy.stats.norm.rvs` to output positive values?
这可能是一个天真的问题,但我找不到任何关于它的帖子,所以我认为问这个问题可能会有用。我找到了一个可能很适合我的数据的分布,但我的所有数据点在现实生活中都是正的(- 不可能的)。
有没有办法强制.rvs
只输出正值?
我想到了一些方法,但它们看起来相当 CPU 密集,比如制作比我需要的更多的值,然后为所有正值和 np.random.choice
做一个布尔掩码. 有没有更好的方法?
我在文档中没有看到任何关于它的信息:/关于这个:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html
我找到这个的短语没有产生任何结果:
https://whosebug.com/search?q=force+scipy+rvs+positive and https://whosebug.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])
取决于您想要保留的分布的真实程度。如果您只想要正值,那实际上不是正态分布,因为您永远不会得到负值。
但是,您可以使用 abs(output)
强制正值,其中输出是您的 numpy.ndarray
。
您似乎在寻找 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
的前两个参数是截断限制。因为这些是针对 正态 分布计算的(平均值=0 标准差=1),我们必须适当地缩放参数。
我们使用 np.infty
作为范围的上限,因为我们不希望在上侧有任何截断。
验证输出的 none 是否为负数
让我们看看超过 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
如您所见,最小值永远不会变为负值。最大值比平均值高出几个标准偏差。
这可能是一个天真的问题,但我找不到任何关于它的帖子,所以我认为问这个问题可能会有用。我找到了一个可能很适合我的数据的分布,但我的所有数据点在现实生活中都是正的(- 不可能的)。
有没有办法强制.rvs
只输出正值?
我想到了一些方法,但它们看起来相当 CPU 密集,比如制作比我需要的更多的值,然后为所有正值和 np.random.choice
做一个布尔掩码. 有没有更好的方法?
我在文档中没有看到任何关于它的信息:/关于这个: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html
我找到这个的短语没有产生任何结果: https://whosebug.com/search?q=force+scipy+rvs+positive and https://whosebug.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])
取决于您想要保留的分布的真实程度。如果您只想要正值,那实际上不是正态分布,因为您永远不会得到负值。
但是,您可以使用 abs(output)
强制正值,其中输出是您的 numpy.ndarray
。
您似乎在寻找 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
的前两个参数是截断限制。因为这些是针对 正态 分布计算的(平均值=0 标准差=1),我们必须适当地缩放参数。
我们使用 np.infty
作为范围的上限,因为我们不希望在上侧有任何截断。
验证输出的 none 是否为负数
让我们看看超过 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
如您所见,最小值永远不会变为负值。最大值比平均值高出几个标准偏差。