Kolmogorov-Smirnov在Scipy中用非标准化数据进行测试

时间:2014-10-10 20:01:51

标签: python scipy

我正在尝试测试值列表是否均匀分布。我知道Kolmogorov-Smirnov测试是正确的测试。但是,我的结果对我没有任何意义。

在下面的代码中,我创建了两个值列表,x是均匀分布的,y是不均匀分布的。

会发生什么: 我在x和y上运行scipy的kstest(),并且x的p值通过,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)

1 个答案:

答案 0 :(得分:0)

您滥用args参数。它并不总是所需的均值和标准偏差,无论您使用的分布是什么参数。在这种情况下,stats.uniform有两个参数,locscale,并且#34;在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)