[removed] remove outlier from an array?

前端 未结 5 1621
-上瘾入骨i
-上瘾入骨i 2021-01-02 03:10
values = [8160,8160,6160,22684,0,0,60720,1380,1380,57128]

how can I remove outliers like 0, 57218, 60720 and 22684?

Is there a library whic

5条回答
  •  时光取名叫无心
    2021-01-02 03:45

    This is an improved version of @james-peterson solution that updates the syntax to the current Javascript standard and adds a more robust way of finding the two quartiles (implemented according to formulas at https://de.wikipedia.org/wiki/Interquartilsabstand_(Deskriptive_Statistik) ). It uses a faster way of copying the array (see http://jsben.ch/wQ9RU for a performance comparison) and still works for q1 = q3.

    function filterOutliers(someArray) {
    
      if(someArray.length < 4)
        return someArray;
    
      let values, q1, q3, iqr, maxValue, minValue;
    
      values = someArray.slice().sort( (a, b) => a - b);//copy array fast and sort
    
      if((values.length / 4) % 1 === 0){//find quartiles
        q1 = 1/2 * (values[(values.length / 4)] + values[(values.length / 4) + 1]);
        q3 = 1/2 * (values[(values.length * (3 / 4))] + values[(values.length * (3 / 4)) + 1]);
      } else {
        q1 = values[Math.floor(values.length / 4 + 1)];
        q3 = values[Math.ceil(values.length * (3 / 4) + 1)];
      }
    
      iqr = q3 - q1;
      maxValue = q3 + iqr * 1.5;
      minValue = q1 - iqr * 1.5;
    
      return values.filter((x) => (x >= minValue) && (x <= maxValue));
    }
    

    See this gist: https://gist.github.com/rmeissn/f5b42fb3e1386a46f60304a57b6d215a

提交回复
热议问题