2015-11-19 139 views
4

考慮代碼:意外scipy.stats.uniform行爲

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

我找到documentationscipy.stats有點稀疏。據我所知,我認爲上述代碼應該在[0,1],[0,2],[0,3],[0,4]和[0,5]之間選擇一個隨機數]。以下是rvsuniform的文檔。

相反,它選擇隨機數p [0,1],並返回[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] 

這是一個種子相關的bug?或者是預期這種行爲?

編輯:我知道很容易解決這個問題;無需告訴我如何:x=ss.uniform.rvs(size=5)*np.arange(1,5)。這個bug或功能在我的大型程序中花了我幾天的困惑和調試。

回答

4

這是一個錯誤:https://github.com/scipy/scipy/issues/2069

不同的變通爲您的例子是與你已經使用的參數沿着明確給出了size說法。

例如,這裏的越野車情況:

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]) 
+0

有趣,謝謝! –

0

我看來像的問題是uniform.rvs它試圖處理*argssize。如果我先創建一個uniform對象,然後調用rvs它似乎表現正常。爲了在範圍[0,1),[5,7],[10,13]上生成3個均勻分佈,我可以定義一個範圍從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]) 

這可能是圍繞在stats.uniform.rvs缺少size參數只是另一種方式呼叫。