Python:拒绝列表中的异常值(序列)

时间:2015-07-30 16:00:34

标签: python algorithm numpy

我试图在python中找到一个算法,它根据a)数据集的趋势(增长/收缩)b)并基于与其直接邻居的数值距离来找到异常值:x不超过> abs(1%)x-1

编辑:如果python中有一个算法,它也可以是三次样条插值。

我已经看到使用std偏差的numpy算法,但由于我必须考虑列表的系列,因此该算法不适用于这种情况。

0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091 < == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065 < == outlier since -,
0.1123,
0.1198

2 个答案:

答案 0 :(得分:0)

您可以做的是计算数据的向后和向前梯度,假设步长为1.您的异常值是那些条件适用的元素:

  • 向前和向前渐变没有相同的符号:趋势的变化
  • 后向梯度的绝对值大于左邻居绝对值的1%

我对你的陈述的解释是两者都必须是真的。

f成为您数据的1-D numpy数组。

f=np.array([
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091, #< == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065, #< == outlier since -,
0.1123,
0.1198
])
bg = 0.0*f # backward gradient, we want them to have the same size as f
fg = 0.0*f # forward gradient, we want them to have the same size as f
bg[1:] = f[1:]-f[:-1]
fg[:-1] = f[1:]-f[:-1]

outliers = (bg*fg<0) * np.hstack((False, np.where(np.abs(bg[1:])>0.01*np.abs(f[:-1]),True,False) ))
# You don't want to remove an element and the next
outliers[1:] = outliers[1:]*np.where( outliers[:-1], False, True )

print 'Outliers = ', f[outliers]
print 'Good = ', f[np.where( outliers, False, True)]

我使用您的数据做了示例,只需将f替换为任何内容。

答案 1 :(得分:0)

如果您希望Python算法单调增加数据,请参阅此问题:

Python - How to check list monotonicity

特别是,这个答案使用了numpy:

https://stackoverflow.com/a/4983495/584846

您可以将此与std偏差的numpy算法结合使用。