簡介
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¬ω¬)。