删除数组中极端异常值的算法

JML*_*JML 1 javascript algorithm

我有一个数组,我在D3图表中用于x轴,并且由于图表大小对于数组的大小而言太小,它会爆炸.我查看了数据,数据中存在极端异常值.见下图. 图表

0附近的数据(不完全为零,其为0.00972等).

数据在70左右开始变得有趣,然后是大约100的大量尖峰.然后数据继续,然后在另一边大约200的相同类型的东西.

任何人都可以帮助我解决一些消除极端异常值的算法吗?例如,给我95%或90%的百分位数并删除连续的元素(例如,不只是中间的一个元素,而是从数组的开头和数组的末尾开始的x个元素,其中x取决于在哪里最好的根据数据做它?在Javascript中也请!

谢谢!

ps你需要保存图像才能正确查看

Sal*_*lba 11

假设数据是这样的

var data[] = {0.00972, 70, 70, ...};
Run Code Online (Sandbox Code Playgroud)

第一种

data.sort(function(a,b){return a-b});
Run Code Online (Sandbox Code Playgroud)

然后取下2.5%和2.5%的底部

var l = data.length;
var low = Math.round(l * 0.025);
var high = l - low;
var data2 = data.slice(low,high);
Run Code Online (Sandbox Code Playgroud)

另一种方法是仅显示平均值的3个标准偏差内的数据.如果数据是正态分布的,则99.7%将落在此范围内.

var sum=0;     // stores sum of elements
var sumsq = 0; // stores sum of squares
for(var i=0;i<data.length;++i) {
    sum+=data[i];
    sumsq+=data[i]*data[i];
}
var mean = sum/l; 
var varience = sumsq / l - mean*mean;
var sd = Math.sqrt(varience);
var data3 = new Array(); // uses for data which is 3 standard deviations from the mean
for(var i=0;i<data.length;++i) {
    if(data[i]> mean - 3 *sd && data[i] < mean + 3 *sd)
        data3.push(data[i]);
}
Run Code Online (Sandbox Code Playgroud)

或类似使用Inter-quartile范围的一些倍数

var median = data[Math.round(l/2)];
var LQ = data[Math.round(l/4)];
var UQ = data[Math.round(3*l/4)];
var IQR = UQ-LQ;
var data4 = new Array();
for(var i=0;i<data.length;++i) {
    if(data[i]> median - 2 * IQR && data[i] < mean + 2 * IQR)
        data4.push(data[i]);
}
Run Code Online (Sandbox Code Playgroud)