我有一个数组如下:

var myArray = [3, 6, 8, 9, 16, 17, 19, 37]

我需要删除异常值,并将其余数据分组到出现的任何独特组中。在这种情况下,37将作为异常值被删除,而[3, 6, 8, 9]将作为第一个组返回,而[16, 17, 19]将作为第二个组返回。

这是第二个例子

var mySecondArray = [80, 90, 100, 200, 280, 281, 287, 500, 510, 520, 800]

200800将作为异常值被删除,[80, 90, 100]将是第一个组,[280, 281, 287]将是第二个,而[500, 510, 520]作为第三个。

我已经编写了可以消除外部异常值的代码,使用第一个和第三个四分位数就足够简单了。换句话说,将800作为异常值从mySecondArray删除是没有问题的。但这不会删除280作为异常值。

我想可以将异常值定义为成员少于n的组,所以真正的问题是什么是一种有效的方法来将这些数据划分为适当数量的组?

任何帮助深表感谢!

最佳答案

jsFiddle Demo

这只是一个简单的实现,可能不是解决这一系列问题的完美方法,但足以满足您的示例要求-它可能还可以解决此问题。

通过查看数字之间的平均距离,并将该距离与每个数字两侧的距离进行比较,应该可以消除异常值。因此,可以将相同的度量标准用于分组。



function Sum(arr){
	return arr.filter(i => !isNaN(i)).reduce((p,c) => p+c,0);
};
function Avg(arr){
	return Sum(arr) / arr.length;
}
function groupby(arr,dist){
  var groups = [];
  var group = [];
  for(var i = 0; i < arr.length; i++){
    group.push(arr[i]);
    if(arr[i+1] == undefined)continue;
    if(arr[i+1] - arr[i] > dist){
      groups.push(group);
      group = [];
    }
  }
  groups.push(group);
  return groups;
}
function groupOutlier(arr){
  var distbefore = arr.map((c,i,a) => i == 0 ? undefined : c - a[i-1]);
  var distafter = arr.map((c,i,a) => i == a.length-1 ? undefined : a[i+1] - c);

  var avgdist = Avg(distafter);

  var result = arr.filter((c,i,a) => !(distbefore[i] == undefined ? distafter[i] > avgdist : (distafter[i] == undefined ? distbefore[i] > avgdist : distbefore[i] > avgdist && distafter[i] > avgdist)));

  return groupby(result,avgdist);
}

var myArray = [3, 6, 8, 9, 16, 17, 19, 37];

console.log(groupOutlier(myArray));

var mySecondArray = [80, 90, 100, 200, 280, 281, 287, 500, 510, 520, 800]

console.log(groupOutlier(mySecondArray));

关于javascript - JavaScript编号数据分组和异常值删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39112174/

10-12 18:04