异常检测方法-MAD
绝对中位差(MAD,median absolute deviation)方法是近年来受到青睐的异常值检测方法。MAD 定义为,一元序列Xi同其中位数偏差的绝对值的中位数(deviation,偏差本身有正有负):假定数据服从正态分布,我们让异常点(outliers)落在两侧的 50% 的面积里,让正常值落在中间的 50% 的区域里:正态分布下,±0.67449包含50%面积,而1/0.67449≈1
·
绝对中位差(MAD,median absolute deviation)方法是近年来受到青睐的异常值检测方法。
MAD 定义为,一元序列 Xi 同其中位数偏差的绝对值的中位数(deviation,偏差本身有正有负):
假定数据服从正态分布,我们让异常点(outliers)落在两侧的 50% 的面积里,让正常值落在中间的 50% 的区域里:
正态分布下,±0.67449包含50%面积,而1/0.67449≈1.4826,因此:
正态分布相关请参考:python标准正态分布表(scipy.stats)
根据Leys(2013)的描述,其原理可分为以下步骤:
- 第一,求出变量A的中位数MA;
- 第二,使用变量A减去中位数MA,得到变量B;
- 第三,对新变量B取绝对值,得到变量C;
- 第四,求出变量C的中位数MC;
- 第五,将MC校正为MAD,MAD=MC*1.4826;
- 第六,使用变量A的中位数加减MAD的倍数:MA±倍数*MAD,超出此范围的数值被认为是异常值。
在第六步中,Leys(2013)本人建议使用2.5倍的MAD进行异常值的判断。
使用MAD法进行异常值检测的主要理由有两个Leys(2013):
- 第一,MAD法对样本量不敏感,即使是在8个样本的数据中依然可行;
- 第二,MAD法对异常值不敏感,不会因为特殊的异常值而导致估计的严重偏差。
实现代码如下:
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
参考:
- Leys, C., Ley, C., Klein, O., Bernard, P.,& Licata, L. (2013). Detecting outliers: Do not use standard deviationaround the mean, use absolute deviation around the median. Journal ofExperimental Social Psychology, 49(4), 764-766.

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)