给你一步一步讲:
最最简单的,排个序,你定个剔除百分比,然后比如你要剔除10%那么你就选择一下,是剔除小的,还是剔除大的,就很快把异常值全找出来了。就是这个方法太糙,我从来不用。
在复杂一点的办法,
拟合
,拟合出这些数据的大趋势
,然后按照比例来筛选,简单给你讲讲。比如如你所说,我可以把这些数据给个编号
0,1
1,2
2,3
3,4
4,5
6,4
7,3
8,2
9,1
10,100
那么变成曲线就是这个样子
这时候你用最小二乘拟合一条曲线,可以是一次的,也可以是多次的,但是次数高了曲线就会弯曲程度很大,容易被你的异常值带跑太多
比如我用了个一次的,拟合出来的这个模样
红线部分,然后你就按照这根线,算一下差值,拟合之后的和原本点的距离,就得出来了一组新的数,比如是
2,3,8,6,4,8,5,6,9,89 (我瞎写的,没算)
这时候,你排个序,从小到大,然后你再定一个剔除率,比如,你觉得最多有10%是异常值,然后你按照次序,要前九个,不要最后一个,也就是把和拟合结果差的最多的10%不要,剔除了。
这个方法按照我的经验,虽然
不是百分百稳定
,不过已经效果不错了。但是是你
拟合的曲线的次数
,是有讲究的,根据你的数据特征,而且我们用的时候还讲究局部拟合和全局拟合,反正拟合代表大趋势,和拟合完的结果差很多,就是异常值,这个思路是这个方法的出发点。也简单给你讲一下,局部拟合我们干啥,
但是有前提条件,第一异常值不在首尾而在中间,第二,来的数据是按照一定规律连续来的
(这个规律就是数据不是瞎来的,不是毫无关系的数据),那么这就很简单了,我们用最小曲率进行局部拟合
,这个最小曲率非常好用,基本上你视觉上看的不顺眼的点,肯定是规律和其他的点不成最小曲率的,这就是为啥数据不能是瞎来的,要是瞎来的规律性不强,可能最小曲率拟合完的曲线和原本点之间的差值大小就会很分散,不利于最后结果,最小曲率是所有拟合方法中,计算最麻烦的,可是效果很漂亮,就是得注意,如果在首尾点的话,插值过程中类似于样条插值,首尾的边界问题得单考虑,这个就很复杂了,不和你细说了。在很多特定情况下,是可以一次一次拟合,判断差值,来建立
迭代关系
剔除野值的,简单来说剔除的结果再返回去用一次,重新检查剔除的是否合理,重复迭代直到稳定,这个得很针对数据特征来使用,但是这种迭代关系一旦建立,那么结果往往都非常令人满意,这个得看情况来对待,就不细说了。滤波也是一种好方法,关于滤波的各种算法网上铺天盖地,针对数据特征用各种滤波方法,也是很好用的。
解决这种问题的方法太多了, 确实对于不同情况,都有针对性的解决方案,实在是没有一种就是万能的方法。
都是我工作中遇到的,可能讲的不详细,希望能对你有帮助