【问题标题】:Javascript number data grouping and outlier removalJavascript数字数据分组和异常值去除
【发布时间】:2016-08-23 23:24:04
【问题描述】:

我有一个数组如下:

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 的组,所以真正的问题是将这些数据分成适当数量的组的有效方法是什么 ?

非常感谢任何帮助!

【问题讨论】:

  • 您可能正在寻找K-means clustering
  • 你的n == 10在这里吗?
  • 不,如果 n 是 10,那么在我的示例中一切都是异常值 :) n 在我的示例中可能是 3。换句话说,包含 2 个或更少项目的组是异常值。
  • @KyleFalconer 感谢您向我指出这一点 - K-means 看起来很像我正在寻找的东西。唯一的问题是,对于给定的实现,您必须指定要退出的组数以及它们之间的距离。有没有办法让它根据现有的数据为您检测到这一点?
  • 通常异常值是大于 Q3 + 1.5 IQR 或低于 Q1 - 1.5 IQR 的点。我不明白你想如何确定组。

标签: javascript arrays outliers


【解决方案1】:

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-25
    • 2016-03-03
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多