使用Scipy中的Kolmogorov-Smirnov检验处理非正态数据

3
我正在尝试测试一组数据是否均匀分布。我知道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个回答

1
您误用了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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接