绝对中位差(MAD,median absolute deviation)方法是近年来受到青睐的异常值检测方法。
MAD 定义为,一元序列 Xi 同其中位数偏差的绝对值的中位数(deviation,偏差本身有正有负):
假定数据服从正态分布,我们让异常点(outliers)落在两侧的 50% 的面积里,让正常值落在中间的 50% 的区域里:
正态分布下,±0.67449包含50%面积,而1/0.67449≈1.4826,因此:
正态分布相关请参考:python标准正态分布表(scipy.stats)
根据Leys(2013)的描述,其原理可分为以下步骤:
在第六步中,Leys(2013)本人建议使用2.5倍的MAD进行异常值的判断。
使用MAD法进行异常值检测的主要理由有两个Leys(2013):
实现代码如下:
from scipy.stats import norm
def mad_based_outlier(points, thresh=3.5):
med = np.median(points, axis=0)
abs_dev = np.absolute(points - med)
med_abs_dev = np.median(abs_dev)
# Z-score 是非标准正态分布标准化后的 x即 z=(x-u)/d,norm.ppf(0.75)=0.674。
mod_z_score = norm.ppf(0.75) * abs_dev / med_abs_dev
return mod_z_score > thresh
参考: