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

參考資料:

python scipy.stats.kstest
R ks.test
數據分析之正態分布檢驗及python實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM