基于中位数绝对偏差(MAD)的异常值检测

6 投票
2 回答
12896 浏览
提问于 2025-04-18 00:58

我想用中位数绝对偏差(MAD)来检测异常值,参考了@Joe Kington的回答,内容如下:

用Python检测一维观察数据中的异常值的方法

不过,我的代码出了点问题,我搞不清楚怎么把异常值在我的数据中标记为nan值:

import numpy as np
data = np.array([55,32,4,5,6,7,8,9,11,0,2,1,3,4,5,6,7,8,25,25,25,25,10,11,12,25,26,27,28],dtype=float)
median = np.median(data, axis=0)
diff = np.sum((data - median)**2, axis=-1)
diff = np.sqrt(diff)
med_abs_deviation = np.median(diff)
modified_z_score = 0.6745 * diff / med_abs_deviation
data_without_outliers = data[modified_z_score < 3.5]
?????
print data_without_outliers

2 个回答

1

问题可能出在这一行:

diff = np.sum((data - median)**2, axis=-1)

使用np.sum()会把结果压缩成一个单一的数字。去掉最外层的求和,这样你的代码就能正常运行了。

另一种解决方法是确保data至少是一个二维数组。你可以用numpy.atleast_2d()来做到这一点。

如果要赋值为NaN,可以参考这个回答:https://stackoverflow.com/a/22804327/4989451

1

使用这个代码有什么问题呢:

data[modified_z_score > 3.5] = np.nan

请注意,这段代码只有在 data 是一个浮点数组的情况下才能正常工作(如果你在计算MAD的话,它应该是浮点数组)。

撰写回答