異常值檢測 —— MAD(median absolute deviation)

MAD 定義爲,一元序列 X i 同其中位數誤差的絕對值的中位數(deviation,誤差自己有正有負);python

MAD=median ( | X i median(X) | )

1. MAD 用於異常點的檢測

假定數據服從正態分佈,咱們讓異常點(outliers)落在兩側的 50% 的面積裏,讓正常值落在中間的 50% 的區域裏:google

P ( | X μ | M A D ) = P ( | X μ | σ M A D σ ) = P ( Z M A D σ ) = 1 / 2

其中 P ( Z M A D σ ) = Φ ( M A D σ ) Φ ( M A D σ ) = 1 / 2 ,又由 Φ ( a ) = 1 Φ ( a ) ,可 Φ ( M A D / σ ) = 3 / 4 M A D / σ = Φ 1 ( 3 / 4 ) ,查表可知, M A D / σ =0.6749。atom

from scipy.stats import norm

def mad_based_outlier(points, thresh=3.5):
    if type(points) is list:
        points = np.asarray(points)
    if len(points.shape) == 1:
        points = points[:, None]
    med = np.median(points, axis=0)
    abs_dev = np.absolute(points - med)
    med_abs_dev = np.median(abs_dev)

    mod_z_score = norm.ppf(0.75) * abs_dev / med_abs_dev
    return mod_z_score > thresh

2. MAD 與基於分位數方法的對比

MAD 的方法相對於分位數方法的一大優點即在於 MAD 方法對樣本大小是不敏感也便是穩定的魯棒的一種評價指標。spa

def percentile_based_outlier(data, threshold=95):
    diff = (100 - threshold) / 2.0
    minval, maxval = np.percentile(data, [diff, 100 - diff])
    return (data < minval) | (data > maxval)

Pythonic way of detecting outliers in one dimensional observation datacode

相關文章
相關標籤/搜索