MAD(Median Absolute Deviation)详解:最稳健的尺度估计方法
一、为什么需要 MAD?
在统计分析中,我们经常需要衡量数据的"离散程度",最常见的方法是标准差:
σ=1n∑(xi−xˉ)2 \sigma = \sqrt{\frac{1}{n} \sum (x_i - \bar{x})^2} σ=n1∑(xi−xˉ)2
但是标准差有一个致命问题:
对异常值极其敏感
二、异常值的影响
考虑数据:
1,2,3,4,5\] \[1, 2, 3, 4, 5\] \[1,2,3,4,5
标准差较小。
但如果加入一个异常值:
1,2,3,4,100\] \[1, 2, 3, 4, 100\] \[1,2,3,4,100
标准差会被严重放大。
三、MAD 的定义
MAD(Median Absolute Deviation)定义为:
MAD=median(∣xi−median(x)∣) \text{MAD} = \text{median}(|x_i - \text{median}(x)|) MAD=median(∣xi−median(x)∣)
步骤:
- 计算中位数
- 计算每个点到中位数的绝对偏差
- 再取这些偏差的中位数
四、为什么 MAD 更稳健?
关键原因:
- 使用 median 而不是 mean
- 不会被极端值拉偏
五、举例说明
数据:
1,2,3,4,100\] \[1, 2, 3, 4, 100\] \[1,2,3,4,100
步骤:
- 中位数:
median=3 \text{median} = 3 median=3
- 绝对偏差:
2,1,0,1,97\] \[2, 1, 0, 1, 97\] \[2,1,0,1,97
- MAD:
MAD=1 \text{MAD} = 1 MAD=1
可以看到:
异常值 100 并没有影响 MAD
六、MAD 与标准差的关系
为了让 MAD 可以近似标准差,需要乘一个系数:
σ≈1.4826×MAD \sigma \approx 1.4826 \times \text{MAD} σ≈1.4826×MAD
这个系数来自正态分布的性质。
七、为什么是 1.4826?
对于标准正态分布:
median(∣Z∣)≈0.6745 \text{median}(|Z|) \approx 0.6745 median(∣Z∣)≈0.6745
所以:
10.6745≈1.4826 \frac{1}{0.6745} \approx 1.4826 0.67451≈1.4826
八、如何用 MAD 判断异常点?
在得到鲁棒尺度估计之后:
σ=1.4826⋅MAD \sigma = 1.4826 \cdot \text{MAD} σ=1.4826⋅MAD
我们可以定义一个"鲁棒标准化距离"(类似 z-score):
zi=∣xi−median(x)∣σ z_i = \frac{|x_i - \text{median}(x)|}{\sigma} zi=σ∣xi−median(x)∣
判断规则
设定阈值 (k),通常取:
- (k = 2.5)(较宽松)
- (k = 3)(常用)
- (k = 3.5)(更严格)
则:
zi>k⇒xi 是异常点 z_i > k \Rightarrow x_i \text{ 是异常点} zi>k⇒xi 是异常点
zi≤k⇒xi 是正常点 z_i \le k \Rightarrow x_i \text{ 是正常点} zi≤k⇒xi 是正常点
直观理解
- 分子:点到"数据中心"的距离(用 median)
- 分母:整体数据的"正常波动范围"(用 MAD)
所以:
zi=这个点偏离中心的程度(按整体尺度归一化) z_i = \text{这个点偏离中心的程度(按整体尺度归一化)} zi=这个点偏离中心的程度(按整体尺度归一化)
举例说明
数据:
1,2,3,4,100\] \[1, 2, 3, 4, 100\] \[1,2,3,4,100
- 中位数:
m=3 m = 3 m=3
- MAD:
MAD=1 \text{MAD} = 1 MAD=1
- 转换尺度:
σ=1.4826 \sigma = 1.4826 σ=1.4826
- 计算异常程度:
对 100:
z=∣100−3∣1.4826≈65 z = \frac{|100 - 3|}{1.4826} \approx 65 z=1.4826∣100−3∣≈65
远大于 3,因此:
100 是异常点 100 \text{ 是异常点} 100 是异常点
一句话总结
∣xi−median∣1.4826⋅MAD>k \frac{|x_i - \text{median}|}{1.4826 \cdot \text{MAD}} > k 1.4826⋅MAD∣xi−median∣>k
即可判定为异常点。
九、Python 示例
python
import numpy as np
def mad(x):
med = np.median(x)
return np.median(np.abs(x - med))
def robust_sigma(x):
return 1.4826 * mad(x)
十、应用场景
MAD 常用于:
- 鲁棒统计
- 异常检测
- 信号处理
十一、总结
MAD 是一个:
- 简单
- 稳健
- 抗异常
的尺度估计方法
在任何存在异常值的场景中,都优于标准差。