假设我们有两个样本data1data2,它们的权重分别为weight1weight2,并且我们要计算两个加权样本之间的Kolmogorov-Smirnov统计量。
我们在python中执行此操作的方式如下:

import numpy as np

def ks_w(data1,data2,wei1,wei2):
    ix1=np.argsort(data1)
    ix2=np.argsort(data2)
    wei1=wei1[ix1]
    wei2=wei2[ix2]
    data1=data1[ix1]
    data2=data2[ix2]
    d=0.
    fn1=0.
    fn2=0.
    j1=0
    j2=0
    j1w=0.
    j2w=0.
    while(j1<len(data1))&(j2<len(data2)):
        d1=data1[j1]
        d2=data2[j2]
        w1=wei1[j1]
        w2=wei2[j2]
        if d1<=d2:
            j1+=1
            j1w+=w1
            fn1=(j1w)/sum(wei1)
        if d2<=d1:
            j2+=1
            j2w+=w2
            fn2=(j2w)/sum(wei2)
        if abs(fn2-fn1)>d:
            d=abs(fn2-fn1)
    return d
在这里,我们只是根据目的修改了经典的两样本KS统计量,该方法在Press,Flannery,Teukolsky,Vetterling中使用-C中的数字食谱-剑桥大学出版社,1992年-第626页。
我们的问题是:
  • 是否有人知道其他方法?
  • 在python/R/*中是否有执行该程序的库?
  • 测试如何?它是否存在,或者我们应该使用改组程序来评估统计信息?
  • 最佳答案

    此解决方案基于scipy.stats.ks_2samp的代码,并且以大约1/10000的时间(notebook)运行:

    import numpy as np
    
    def ks_w2(data1, data2, wei1, wei2):
        ix1 = np.argsort(data1)
        ix2 = np.argsort(data2)
        data1 = data1[ix1]
        data2 = data2[ix2]
        wei1 = wei1[ix1]
        wei2 = wei2[ix2]
        data = np.concatenate([data1, data2])
        cwei1 = np.hstack([0, np.cumsum(wei1)/sum(wei1)])
        cwei2 = np.hstack([0, np.cumsum(wei2)/sum(wei2)])
        cdf1we = cwei1[[np.searchsorted(data1, data, side='right')]]
        cdf2we = cwei2[[np.searchsorted(data2, data, side='right')]]
        return np.max(np.abs(cdf1we - cdf2we))
    
    这是对其准确性和性能的测试:
    ds1 = np.random.rand(10000)
    ds2 = np.random.randn(40000) + .2
    we1 = np.random.rand(10000) + 1.
    we2 = np.random.rand(40000) + 1.
    
    ks_w2(ds1, ds2, we1, we2)
    # 0.4210415232236593
    ks_w(ds1, ds2, we1, we2)
    # 0.4210415232236593
    
    %timeit ks_w2(ds1, ds2, we1, we2)
    # 100 loops, best of 3: 17.1 ms per loop
    %timeit ks_w(ds1, ds2, we1, we2)
    # 1 loop, best of 3: 3min 44s per loop
    

    关于python - 如何计算两个加权样本之间的Kolmogorov-Smirnov统计量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40044375/

    10-12 22:02