K-S 检验 · 一步一讲
统计笔记 · Kolmogorov–Smirnov 拟合优度检验

K-S 检验,一步一讲

两道题一次讲透:书上的例题——100 分钟观测 50 个到达间隔,检验是否服从指数分布;考卷上的真题——100 km 公路 30 起事故,检验是否均匀分布。每一步都动手算给你看,最后还有一个能自己玩的计算器。

问题一结论 D=0.1054 < 0.192 不拒绝 问题二结论 D=0.1720 < 0.24 不拒绝 全程手算可复现
理论分布 F(x) 数据堆出的"楼梯" Sn(x) D⁺ 候选落差 D⁻ 候选落差
上图是问题二的真实计算结果:绿楼梯是 30 起事故堆出的经验分布,黑线是均匀分布的理论直线。两线之间最大的那段红色落差,就是要找的 D = 0.1720
先修课

30 秒抓住 K-S 检验的本质

所有 K-S 题目,不管外衣多花哨,说到底都是同一件事:把理想曲线和数据楼梯叠在一起,量最大落差

① 画两条线

一条是理论给的"理想曲线" F(x)(累积分布函数,比如均匀分布就是一条对角线);一条是数据堆出来的"楼梯" Sn(x)(经验分布函数,每经过一个数据点往上跳 1/n)。

② 量最大落差

在两条线之间找最大的垂直距离。楼梯是"跳"上去的,所以每个跳跃点要量两侧:跳完的顶比线高多少(D⁺ 候选),没跳的底比线低多少(D⁻ 候选)。

③ 查表下结论

D = max(D+, D),和临界值表里的 Dα(n) 比大小:落差小 → 不拒绝原假设;落差超过临界值 → 拒绝。

D+ = maxi { in − F(x(i)) },   D = maxi { F(x(i)) − i−1n },   D = max(D+, D)

其中 x(i)从小到大排第 i 个的数据点;判定规则: D < Dα(n)不拒绝 H₀D ≥ Dα(n)拒绝 H₀

为什么一个跳跃点要量两次?

楼梯在每个数据点"瞬间上跳 1/n":跳之前高度是 (i−1)/n,跳之后是 i/n。理论线可能夹在两层之间,所以上方落差(i/n − F)和下方落差(F − (i−1)/n)要分开算,各自的最大值才叫 D⁺ 和 D⁻。

考场速记口诀

"上顶减线得 D⁺,线减下底得 D⁻;两值取大再查表,小于临界不拒绝。" 记住跳跃点上顶 = i/n下底 = (i−1)/n,剩下的只是算术。

问题一

书上例题:指数分布为什么要"绕圈"检验

这一页最绕的地方在于:没有直接检验指数分布,而是把数据加工成均匀分布再检验。为什么多此一举?看完卡点你就懂了。

题目(书上例题)

连续观察某到达过程 100 分钟,记录 50 个相邻到达的间隔时间。问:在 α = 0.05 下,能否认为间隔时间服从指数分布(即到达过程是泊松过程)?

卡点:指数分布有个未知参数 λ

K-S 临界值表有个硬前提——理论分布的参数必须事先完全已知。λ 未知,如果用这 50 个数据先估 λ 再查表,估计"吸收"了一部分偏差,算出的 D 和表里的临界值对不上,检验直接失效

钥匙:泊松过程的到达时刻是均匀的

若到达真是泊松过程(间隔 ~ 指数分布),则固定时段 [0, T] 内,到达时刻(不是间隔!)均匀分布在 [0, T] 上。于是把问题换成"到达时刻 ~ U(0,1)?"——均匀分布没有未知参数,K-S 直接可用

书上的做法,四步

  1. 间隔 → 到达时刻(累加)

    把间隔逐个累加:S₁ = T₁,S₂ = T₁ + T₂,…,得到每个事件的"发生时刻"。

  2. 归一化到 [0, 1]

    每个到达时刻除以总时长:Uᵢ = Sᵢ / T(本题 T = 100 分钟),把 [0, 100] 映射到 [0, 1]。

  3. 排序,逐点量落差

    把 Uᵢ 从小到大排成 u₍₁₎ ≤ … ≤ u₍₅₀₎,逐点算 i/n − u₍ᵢ₎u₍ᵢ₎ − (i−1)/n

    书中结果:D⁺ = 0.1054,D⁻ = 0.0080
  4. 查表,下结论

    n = 50 超出小样本表,用渐近公式 D₀.₀₅ ≈ 1.36/√50 ≈ 0.192

    D = 0.1054 < 0.192不拒绝 H₀
D⁺(楼梯高出线最多)
0.1054
理论"超前"经验的最大幅度
D⁻(楼梯低于线最多)
0.0080
几乎贴线 —— 到达时刻铺得很匀
K-S 统计量 D
0.1054
max(0.1054, 0.0080)
临界值 D₀.₀₅(50)
≈ 0.192
渐近公式 1.36 / √50
结论:不拒绝 H₀

0.1054 < 0.192,差距不显著 ⇒ 可以认为间隔时间服从指数分布,到达过程是泊松过程。注意:全程没有估计 λ——这正是"绕圈"的意义。

一句话总结这一页

它检验的并不是"数据像不像指数分布",而是利用泊松过程到达时刻的均匀性,把问题翻译成"归一化到达时刻像不像 U(0,1)",绕开 λ 的估计。

手算演示

亲手算一遍:奶茶店 5 位顾客

书上 50 个点没法手算,换成 5 个点的迷你版,同样的四步走一遍。场景:早高峰观察奶茶店 8:00–9:00(共 T = 60 分钟),5 位顾客与上一位的间隔分别是 5、12、8、15、10 分钟——他们是不是"随机到达"的?点"下一步"跟着算。

走查计算表 当前步骤涉及的列会高亮,最大值带徽标
i间隔 Tᵢ到达时刻 Sᵢuᵢ = Sᵢ/60 i/n − uᵢuᵢ − (i−1)/n
F(x) = x 楼梯 Sₙ(x) D⁺ 候选 D⁻ 候选
问题二

考试真题:均匀分布的"直球"检验

这道题和书上例题互为"正反例":这次要检验的本身就是均匀分布,区间已知,参数齐全——不用绕圈,直接算。

题目(考试真题)

某公路全长 100 km。交管部门统计了一年内 30 起交通事故的发生位置(km),并声称"事故在全路段近似均匀分布"。在 α = 0.05 下检验这一说法。

H₀:事故位置 ~ U[0, 100](均匀)  vs  H₁:不是均匀分布

数据按题目照片还原;各统计量与原题一致:D⁺ = 0.047、D⁻ = 0.1720、分组偏差 ≈ 0.15。

第 1 步 · 把 30 个位置标在公路上,先肉眼感受

肉眼可见的"扎堆"

最后 85–100 km 只有全路段的 15%,却发生了 9 起事故(占 30%)。K-S 检验要做的,就是把这种"肉眼感觉"变成一个可以和临界值比较的数字。

已按从小到大排序(K-S 的第一步永远是排序);红色 = 落在 85 km 之后的"扎堆区"。

第 2 步 · 归一化,逐点算两种落差

每个位置除以 100 得到 R₍ᵢ₎ = x₍ᵢ₎/100,映射到 [0,1];均匀分布的理论线是 F(x) = x。逐点算 i/n − R₍ᵢ₎(D⁺ 候选)与 R₍ᵢ₎ − (i−1)/n(D⁻ 候选)。把鼠标放到表格行上,右图对应落差会同步加粗。

30 个点逐个计算 高亮行 = 两类落差的最大值所在
ix₍ᵢ₎R₍ᵢ₎i/30(i−1)/30i/n − R₍ᵢ₎R₍ᵢ₎ − (i−1)/n
D⁺ 最大值出现在 i = 14(0.0467);D⁻ 最大值在 i = 22 与 i = 25 并列(0.1720)。
F(x) = x 楼梯 Sₙ(x) D⁺ 候选(max 0.0467) D⁻ 候选(max 0.1720)

第 3 步 · 取最大、查表、下结论

D⁺ = max{i/n − R₍ᵢ₎}
0.0467
在 i = 14 处(原题记作 0.047)
D⁻ = max{R₍ᵢ₎ − (i−1)/n}
0.1720
在 i = 22 与 i = 25 处并列
K-S 统计量 D
0.1720
max(0.0467, 0.1720)
临界值 D₀.₀₅(30)
0.24
查 K-S 临界值表
结论:不拒绝 H₀

D = 0.1720 < D₀.₀₅(30) = 0.24现有证据不足以推翻"事故均匀分布",交管局的说法在 α = 0.05 的显著性水平下成立。

为什么 D⁻ 远大于 D⁺?

后段事故密 → 楼梯在后半段"爬得比对角线慢半拍",对角线在跳跃点起跳之前高出楼梯最多 0.1720;而"跳完之后"楼梯很少反超对角线,所以 D⁺ 只有 0.0467。落差的方向,暴露了扎堆的位置。

严谨一点:"不拒绝" ≠ "证明均匀"

n = 30 的检验力有限,末段偏多值得交管部门继续观察。但按本次数据和 α = 0.05,统计结论只能是证据不足,不拒绝——考试这样写就是满分表述。

备用解法:分组近似法(题目照片上半部分的写法)

把 [0,100] 切成 6 段,数每段事故数,用组右端点的累积频率和理论 F(x) = x/100 比较:

区间 (km)事故数累积频率 S理论 F = x/100|S − F|

最大偏差 ≈ 0.15 < 0.24,结论一致。注意分组法把组内位置信息丢掉了(偏差被"磨平",0.15 < 标准法的 0.1720),所以考试优先写标准的单样本 K-S(第 2 步那张 30 行表),分组法可作验算。

总结

两道题放一起,规律就出来了

一个是"绕圈",一个是"直球"——区别只在于理论分布的参数是否事先已知

问题一 · 书上例题问题二 · 考试真题
原始数据50 个到达间隔时间30 起事故的位置坐标
要检验什么间隔 ~ 指数分布位置 ~ U[0, 100]
参数是否已知✗ λ 未知 → 不能直接查表✓ 区间已知 → 条件齐全
关键动作间隔累加 → 到达时刻 → 除以 T → 检验 U(0,1)排序 → 除以 100 → 检验 U(0,1)
本质间接检验:借泊松过程性质绕过参数估计直接检验:标准单样本 K-S
结果D = 0.1054 < 0.192 ⇒ 不拒绝D = 0.1720 < 0.24 ⇒ 不拒绝

拿到任意分布检验题,怎么想?

读题:要检验什么分布?

写下 H₀ 与理论 CDF F(x)

参数全已知?

端点、λ、μ、σ 是否题目直接给定

是 → 直接 K-S

排序、算 D⁺/D⁻、查表(如问题二)

否 → 先变换

能否转成参数已知的分布?(如问题一:泊松间隔 → 均匀到达时刻)都不行则改用 Lilliefors 等方法

三个最容易丢分的地方

① i/n 与 (i−1)/n 别搞反

D⁺ 用跳完后的 i/n(上顶),D⁻ 用起跳前的 (i−1)/n(下底)。口诀:上顶配 D⁺,下底配 D⁻。

② 先排序,再计算

x₍ᵢ₎ 是"第 i 小",不是"第 i 个输入"。忘记排序,后面整张表全错——这是最常见的失分点。

③ 参数不能现估现用

用同一批数据估计参数再查 K-S 表,临界值失效——这正是问题一"绕圈"的全部原因。

工具

K-S 临界值速查表

做题查这一张就够。n ≤ 35 查表;n > 35 用渐近公式 Dα ≈ c(α) / √n。高亮的是本页两道题用到的格子。

单样本 K-S 检验临界值 Dα(n) P(D ≥ 表值) = α;本表为精确小样本值
练一练

K-S 计算器:贴上你的数据,一键出结论

自动排序、算 D⁺/D⁻/D、查临界值、下结论、画落差图。支持 U(0,1)、任意 U(a,b) 与 N(μ, σ²)——参数必须事先给定,不能来自这批数据(忘了为什么就回问题一看一眼)。

临界值来源:n 命中速查表(1–20、25、30、35)取精确表值;其余用渐近公式 c(α)/√n 近似并标注。

左边贴入数据(或点一个预设),再点"计算"
这里会出现 D⁺、D⁻、D、临界值、结论和落差图