我正在尝试在 python 中找到一种算法,该算法基于 a) 数据集的趋势(增长/收缩)b) 和基于与其直接邻居的数值距离:x 不超过 > abs(1 % 的 x-1
编辑:如果 python 中有可用的算法,它也可以是三次样条插值。
我见过使用标准偏差的 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
最佳答案
您可以做的是计算数据的后向和前向梯度,假设步长为 1。您的离群值是那些条件适用的元素:
- 后向和前向梯度符号不同:趋势变化
- 后向梯度绝对值大于左邻域绝对值的1%
我对您的陈述的解释是两者都必须为真。
设 f
为数据的一维 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
替换为任何内容即可。
关于Python:拒绝列表中的异常值(序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728704/