2014-10-10 70 views
2

我想測試一個值的列表是否均勻分佈。我知道Kolmogorov-Smirnov測試是正確的測試。但是,我的結果對我來說沒有任何意義。Kolmogorov-Smirnov在非標準化數據的Scipy測試

在下面的代碼中,我創建了兩個值列表,x是均勻分佈的,y是不均勻分佈的。

應該發生什麼: 我跑SciPy的對x和y,併爲X經過p值kstest()時,Y的p值未通過。

發生了什麼: 我在x和y上運行scipy的kstest(),x和y的p值都是0.0。

In [1]: 

from scipy import stats 
import scipy as sp 
import numpy as np 
import math 
import matplotlib.pyplot as plt 
%matplotlib inline 
In [2]: 

x = np.random.uniform(size=1000) 
sigma_x = np.std(x) 
mean_x = x.mean() 

plt.hist(x) 
plt.show() 

In [3]: 

y = x**4 
sigma_y = np.std(y) 
mean_y = y.mean() 

plt.hist(y) 
plt.show() 

In [4]: 

stats.kstest(x, 'uniform', args=(mean_x,sigma_x)) 
Out[4]: 
(0.499, 0.0) 
In [5]: 

stats.kstest(y, 'uniform', args=(mean_y,sigma_y)) 
Out[5]: 
(0.67400000000000004, 0.0) 

回答

0

您錯用了args參數。它並不總是所需的平均值和標準偏差,它是您使用的分佈所採用的任何參數。在這種情況下,stats.uniform需要兩個參數,即locscale,它在「locloc + scale之間是恆定的」。

所以你不想使用均值和標準差。相反,您需要定義統一分佈的最小值和最大值,如果要針對已知均勻分佈進行測試,則需要args=(0, 1);如果要使用樣本估計值,則需要args=(min(x), max(x))

from scipy import stats 
import numpy as np 

x = np.random.uniform(size=1000) 
y = x**4 

stats.kstest(x, 'uniform', args=(0, 1)) 
# (0.029538499688200326, 0.34247911001793319) 

stats.kstest(y, 'uniform', args=c(0, 1)) 
# (0.50121963249814794, 0.0)