从主要线性递增的数组中删除异常值

时间:2019-04-22 08:13:32

标签: arrays algorithm sorting filtering outliers

给出一个应该线性增加的数组,但是

  • 可能缺少一些数字,并且
  • 可能会抛出一些意外的数字,

您将如何构建算法以从阵列中删除所有异常值?

可能的数组示例:

  

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,5,6,6,6,5,5,6,6,6,6,6,6,4,6 ,6,3,4,6,6,6,6,5,6,6,6,4,5,6,3,6,6,6,6,6,6,6,6,5,6,6,6 ,6,6,4,6,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,6,3 ,6,6,3,6,6,6,6,6,6,5,5,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;
  })
}

可能相关的链接:Javascript: remove outlier from an array?

1 个答案:

答案 0 :(得分:0)

似乎您的内部数据值确实具有恒定的增量。因此,计算增量,采用模式并保持遵循该增量的值序列(达到适当的容差)。