在 MATLAB 中计算 Dvoretzky–Kiefer–Wolfowitz 边界

机器算法验证 统计学意义 matlab kolmogorov-smirnov 测试
2022-04-03 20:32:57

当我对两个给定的数据向量运行 Kolmogorov-Smirnov 测试(MATLAB 中的 kstest2 函数)时,我得到了 KS Statistic 的值。我应该如何使用这些信息计算 Dvoretzky–Kiefer–Wolfowitz (DKW) 界?当我查看 wiki 和其他网页时,看起来如果我绘制 ECDF,整个 ECDF 将由两条曲线界定(例如此处的幻灯片 14:http: //cseweb.ucsd.edu/classes/fa07/cse103 /CDFs.pdf )。但是,在我看来,DKW 界限只是一个单一的值,而不是两边都有界限。有人可以解释一下在 MATLAB 中这个界限的计算吗?任何帮助将不胜感激。谢谢。

问候,研发

1个回答

听起来你想计算一个置信带:一个包含整个 CDF 概率的区域1α. 使用 Dvoretzky–Kiefer–Wolfowitz 不等式执行此操作涉及三个步骤:

  1. 生成 CDF(即,对您的值进行排序和计数——在 matlab 中很简单)

  2. 不等式本身表明

    P(supx|F(x)F^(x)|>ϵ)2exp(2nϵ2)
    在哪里 F(x)是“真实”的总体 CDF,F^(x)是您的示例 CDF,并且n是数据点的数量。将该不等式的右侧设置为α并重新安排产量:

ϵ=12nlog(2α)

  1. 您现在可以绘制置信带。置信带有一个上边缘U(x)和一个下边缘L(x)
    L(x)=max{F^(x)ϵ,0}U(x)=min{F^(x)+ϵ,1}

将其翻译成 matlab 非常简单:

function [low_edge, F_hat, hi_edge, x] = dkw_bounds(data, alpha) [F_hat, x] = ecdf(data); epsilon = sqrt(ln(2/alpha)/(2*length(data))); low_edge = max(F_hat - epsilon, 0); %Does the right thing here, use pmax in R hi_edge = min(F_hat + epsilon, 1); end

然后,您可以绘制三条曲线,使用它们来形成 apatch等。