gpt4 book ai didi

python - 如何计算两个加权样本之间的 Kolmogorov-Smirnov 统计量

转载 作者:太空狗 更新时间:2023-10-30 02:56:16 25 4
gpt4 key购买 nike

假设我们有两个样本 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 - pag.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com