【发布时间】:2012-07-26 01:38:00
【问题描述】:
是否有一个 numpy 内置函数可以执行以下操作?也就是说,获取一个列表d 并返回一个列表filtered_d,根据d 中点的一些假设分布,删除了所有外围元素。
import numpy as np
def reject_outliers(data):
m = 2
u = np.mean(data)
s = np.std(data)
filtered = [e for e in data if (u - 2 * s < e < u + 2 * s)]
return filtered
>>> d = [2,4,5,1,6,5,40]
>>> filtered_d = reject_outliers(d)
>>> print filtered_d
[2,4,5,1,6,5]
我说“类似”是因为该函数可能允许不同的分布(泊松、高斯等)和这些分布中的不同异常值阈值(例如我在这里使用的 m)。
【问题讨论】:
-
相关:Can scipy.stats identify and mask obvious outliers?,尽管这个问题似乎处理更复杂的情况。对于您描述的简单任务,外部包似乎是矫枉过正。
-
我在想,鉴于主 numpy 库中的内置函数数量,奇怪的是没有什么可做的。处理原始、嘈杂的数据似乎很常见。
-
线性异常值可以通过
numpy std函数找到,但是,如果数据是非线性的,例如抛物线或三次函数,standard deviation将无法很好地处理任务,因为它需要回归来帮助计算异常值。 -
这就是我编写这个 repo 的原因:outliers.py