意外的scipy.stats.uniform行为

时间:2015-11-19 17:25:35

标签: numpy scipy statistics

考虑代码:

import scipy.stats as ss
x = ss.uniform.rvs(np.zeros(5),np.array([1,2,3,4,5]))

我发现scipy.stats的{​​{3}}有点稀疏。据我所知,我认为上面的代码应该在[0,1],[0,2],[0,3],[0,4]和[0,5]之间选择一个随机数。 ]。以下是documentationrvs的文档。

相反,它在[0,1]中选择一个随机数p并返回[p,2p,3p,4p,5p]:

print x, np.diff(x)
[ 0.79352054  1.58704108  2.38056162  3.17408215  3.96760269] 
[ 0.79352054  0.79352054  0.79352054  0.79352054]

这是种子相关的错误吗?或者预期会出现这种情况吗?

编辑:我知道很容易解决这个问题;无需告诉我如何:x=ss.uniform.rvs(size=5)*np.arange(1,5)。这个错误或功能让我在我的大型程序中花费了几天的混乱和调试。

2 个答案:

答案 0 :(得分:4)

这是一个错误:http://localhost:8080/SoccerSpringMaven3/springSoccer/users/

您的示例的另一种解决方法是明确地将In [1]: import scipy.stats as ss In [2]: x = ss.uniform.rvs(np.zeros(5), np.array([1,2,3,4,5])) In [3]: x Out[3]: array([ 0.23848443, 0.47696885, 0.71545328, 0.9539377 , 1.19242213]) In [4]: x/x[0] Out[4]: array([ 1., 2., 3., 4., 5.]) 参数与您正在使用的参数一起提供。

例如,这是一个错误的案例:

size=5

解决方法是包含参数In [18]: x = ss.uniform.rvs(np.zeros(5), np.array([1,2,3,4,5]), size=5) In [19]: x Out[19]: array([ 0.67638863, 1.2253443 , 0.0812362 , 3.87469514, 3.88145975]) In [20]: x/x[0] Out[20]: array([ 1. , 1.81159802, 0.12010285, 5.72850428, 5.73850534])

{{1}}

答案 1 :(得分:0)

我认为问题出现在uniform.rvs,试图同时处理*argssize。如果我首先创建一个uniform对象,然后调用rvs,它似乎就会出现。

要产生3个均匀分布,在范围[0,1),[5,7),[10,13]上,我可以定义范围为0,5,10的uniform个对象,和范围集1,2,3:

In [543]: u=stats.uniform(np.array([0,5,10]),np.array([1,2,3]))

现在,我可以生成具有兼容尺寸3维的任何尺寸分布:

In [544]: x = u.rvs((5,3))
In [545]: x
Out[545]: 
array([[  0.28689704,   6.60720428,  12.78343224],
       [  0.3058824 ,   6.22486472,  11.5212319 ],
       [  0.32274603,   6.72905376,  10.90760859],
       [  0.98299464,   5.39877562,  12.00342556],
       [  0.76728063,   5.26172895,  10.38177301]])
In [546]: x.mean(axis=0)
Out[546]: array([  0.53316015,   6.04432547,  11.51949426])

这可能只是围绕size来电中丢失的stats.uniform.rvs参数的另一种方式。