Javascript数字数据分组和异常值删除

Javascript数字数据分组和异常值删除,javascript,arrays,outliers,Javascript,Arrays,Outliers,我有一个数组,如下所示: 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] 200和800将作为异常值删除,[80,90,100]将作为第一组,[280,281,287]将作

我有一个数组,如下所示:

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]

200
800
将作为异常值删除,
[80,90,100]
将作为第一组,
[280,281,287]
将作为第二组,
[500,510,520]
将作为第三组

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

我假设一个异常值可以定义为一个成员少于
n
的组,因此真正的问题是如何有效地将这些数据划分为适当数量的组

非常感谢您的帮助

这只是一个简单的实现,它可能不是这组问题的完美解决方案,但对于您的示例来说,它应该足够了——它还可以工作得更远

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

函数和(arr){
返回arr.filter(i=>!isNaN(i)).reduce((p,c)=>p+c,0);
};
功能平均值(arr){
返回和(arr)/arr.length;
}
功能分组依据(arr、dist){
var组=[];
var组=[];
对于(变量i=0;idist){
组。推(组);
组=[];
}
}
组。推(组);
返回组;
}
函数组异常值(arr){
var distbefore=arr.map((c,i,a)=>i==0?未定义:c-a[i-1]);
var distafter=arr.map((c,i,a)=>i==a.length-1?未定义:a[i+1]-c);
var avgdist=平均值(distafter);
var result=arr.filter((c,i,a)=>!(distbefore[i]==未定义?distbefore[i]>avgdist:(distbefore[i]==未定义?distbefore[i]>avgdist:distbefore[i]>avgdist&&distbefore[i]>avgdist));
返回groupby(结果,avgdist);
}
var myArray=[3,6,8,9,16,17,19,37];
log(groupOutlier(myArray));
var mySecondArray=[8090100200280281281287500510510520800]

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