1

在 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)

你知道为什么会这样吗?

4

1 回答 1

2

文档字符串中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)
于 2018-08-02T03:10:10.297 回答