Scipy kstest对于相似的一组值返回不同的p值

时间:2018-08-02 02:35:54

标签: python numpy scipy p-value uniform-distribution

在Python 3.6.5和scipy 1.1.0中,当我运行Kolmogorov-Smirnov测试以检查均匀分布时,如果我将kstest函数与行一起输入,则会得到两个相反的结果(从p值角度来看)或列向量:

from scipy import stats
import numpy as np

>>> np.random.seed(seed=123)
>>> stats.kstest(np.random.uniform(low=0, high=1, size=(10000, 1)), 'uniform')

KstestResult(statistic=0.9999321616877249, pvalue=0.0)

>>> np.random.seed(seed=123)
>>> stats.kstest(np.random.uniform(low=0, high=1, size=(1, 10000)), 'uniform')

KstestResult(statistic=0.9999321616877249, pvalue=0.00013567662455016283)

您知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

docstring of kstest中提到,当kstest的第一个参数是一个数组时,它应该是一个一维数组。在您的示例中,您要传递二维数组(其中每种情况中的一个维都是微不足道的)。事实证明,当输入数组为二维时,kstest中的代码将无法实现您的期望。

简单的解决方法是在将数组传递到kstest之前对其进行展平。 ravel()方法可用于执行此操作。例如,

In [50]: np.random.seed(seed=123)

In [51]: x = np.random.uniform(low=0, high=1, size=(10000, 1))

In [52]: stats.kstest(x.ravel(), 'uniform')
Out[52]: KstestResult(statistic=0.008002577626569918, pvalue=0.5437230826096209)

In [53]: np.random.seed(seed=123)

In [54]: x = np.random.uniform(low=0, high=1, size=(1, 10000))

In [55]: stats.kstest(x.ravel(), 'uniform')
Out[55]: KstestResult(statistic=0.008002577626569918, pvalue=0.5437230826096209)