今天同学问我去除一堆数据里的异常值(突然上升、突然下降)有什么好的算法,并附有一张截图:
这些突然变化的点就是需要检测出来 的点。
针对这个问题,首先想到的是出现奇异值的时候与前一个点和后一个点是有很大的变化的,因此,用差分应该是管用的,差分后的结果是:
只需要设置一个阈值,就可以将大部分的‘变异值’过滤掉
本文中设置的阈值是3和-3,只有前一个差分值和后一个差分值是一正一负,或者是一负一正的情况下才能认为是发生了突变,具体的程序如下所示:
length = len(d_diff)
temp = []
for i in range(length-1):
if d_diff[i]>3 and d_diff[i+1]<-3:
#temp.append(i+1)
print i+1
if d_diff[i]<-3 and d_diff[i+1]>3:
#print i+1
temp.append(i+1)
a = data.drop(temp)
过滤后的结果如下所示:
从图中对比可得,通过引入差分过滤方式,可以快速有效地将大部分的异常值删除并记录下来。