2014-10-10 32 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)