【问题标题】:Scipy kstest returns different p-values for similar sets of valuesScipy kstest 为相似的值集返回不同的 p 值
【发布时间】:2018-08-02 02:35:53
【问题描述】:

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

你知道为什么会这样吗?

【问题讨论】:

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


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2013-02-08
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多