【发布时间】:2019-09-11 11:02:37
【问题描述】:
给定一个应该线性递增的数组,但是
- 可能缺少一些数字并且
- 可能会输入一些意想不到的数字,
您将如何构建一个算法来从数组中删除所有异常值?
可能的数组示例:
1,2,3,4,1,1,1,100,5,6,7
1,2,4,100,5,6,7
1,2,4,100,101,5,6,7,300
2,3,4,5,6,7,300
在上述所有示例中,您应该能够知道数组应该是 1-7 还是 2-7。
一些现实生活中的示例数组:
1、2、295、296、297、4、5、6、8、9、10、11、12、13、6、6、6、6、6、6、6、6、6、6 , 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 , 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 6, 4, 6 , 6, 3, 4, 6, 6, 6, 5, 6, 6, 6, 4, 5, 6, 3, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6 , 6, 6, 4, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 4, 6, 6, 6, 6, 6 , 6, 5, 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 4, 4, 6, 6, 6, 6, 6, 3, 6, 6, 6, 3 , 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3 , 6, 6, 3, 6, 6, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 , 6, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 15, 18, 20, 21, 22, 23, 24, 27, 28, 30, 31, 32, 33, 34 , 35, 36, 37
1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、26、712、383 , 114, 118, 225, 304, 323, 349, 357, 550, 556, 590, 649, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41 , 42, 43, 44, 45, 46, 47, 48, 49, 51
我想出的一个解决方案是过滤掉所有大于 N (=5?) 大于前一个有效值的值,以及所有小于前一个有效值的值。
const filterOutliers = (someArray) => {
let previousValidValue = null;
return someArray.filter((x, index) => {
//Assume the first value is valid - although this assumption might not always be true.
if(!previousValidValue) {
previousValidValue = x;
return true;
}
// if the number is less than the previous valid value, remove it
if(x < previousValidValue) {
return false;
}
// if the number is more than 5 greater than the last valid value, remove it
if(x > previousValidValue + 5) {
return false;
}
previousValidValue = x;
return true;
})
}
【问题讨论】:
-
这些工作的基本方法是生成一个简单的线性回归线方程(因为你说的主要是线性的),然后通过你的增量值消除偏离线方程的那些(离群值)选择。 Here is a good tutorial on generating the linear regression line equation
-
@Redu:最小二乘的标准线性回归对异常值非常敏感。这不适用于给定的数据集。
标签: arrays algorithm sorting filtering outliers