用python进行KS检验
简介
Kolmogorov-Smirnov test(KS检验)是一种重要的非参数检验方法,应用非常广泛,比如之前介绍的数据库CMap,其核心算法就是借鉴KS检验。
KS检验是一种统计检验方法,其通过比较两样本的频率分布、或者一个样本的频率分布与特定理论分布(如正态分布)之间的差异大小来推论两个分布是否来自同一分布。
实现方法:
R 代码:
ks.test(x)
#其中x为“a numeric vector of data values”,也就是数值型向量。
Python 代码:
from scipy import stats
stats.kstest(rvs, cdf, args=(),…)
#其中rvs可以是数组、生成数组的函数或者scipy.stats里面理论分布的名字
#cdf可以与rvs一致。若rvs和cdf同是数组,则是比较两数组的分布是否一致;一个是数组,另一个是理论分布的名字,则是看样本是否否和理论分布
#args是一个元组,当rvs或者cds是理论分布时,这个参数用来存储理论分布的参数,如正态分布的mean和std。
遇到的问题:
在实际问题中,有一组大小一万的数组,长这样:
test=[4949.58940397, 4712.41059603, 4426.70198675, 4427.8807947 ,
4695.1192053 , 4929.2384106 , 4403.08609272, 4606.33112583,
4599.23178808, 4523.54966887, 4551.41721854, 4784.89403974,……]
想看一下这组数据是否符合正态分布,直接使用上述python代码后,发现没有报错,却得到这样的结果:
Input: stats.kstest(test, 'norm')
Out: KstestResult(statistic=1.0, pvalue=0.0)
结果肯定有问题,通过看kstest函数的原始文档,发现之前有个参数被忽略,也就是args
args
tuple, sequence, optional
Distribution parameters, used if rvs or cdf are strings or callables.
解决方法
然后通过添加相应的args参数,即期望的正态分布的平均值和标准差
Input: stats.kstest(test, 'norm',args=(test.mean(),test.std())
Output: KstestResult(statistic=0.005777479839093713, pvalue=0.8923049615924274)
结果正常了!可见欲速则不达,论认真读函数说明文档的重要性(lll¬ω¬)。