Javascript 一种消除数组中极端异常值的算法

Javascript 一种消除数组中极端异常值的算法,javascript,algorithm,Javascript,Algorithm,我有一个数组,我用它来表示D3图形中的x轴,它爆炸了,因为图表的大小对于数组的大小来说太小了。我查看了数据,发现数据中存在极端的异常值。见下表。 0左右的数据(不是完全为零,而是0.00972等) 数据在70岁左右开始变得有趣,然后在100岁左右出现大量峰值。然后数据继续,然后在另一边的相同类型的东西大约200 有人能帮我用一些算法去除极端的异常值吗?e、 g.给我95%或90%的百分位数,并删除连续元素(例如,不只是从中间删除一个元素,而是从数组的开头和结尾删除x个元素,其中x取决于根据数据

我有一个数组,我用它来表示D3图形中的x轴,它爆炸了,因为图表的大小对于数组的大小来说太小了。我查看了数据,发现数据中存在极端的异常值。见下表。

0左右的数据(不是完全为零,而是0.00972等)

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

有人能帮我用一些算法去除极端的异常值吗?e、 g.给我95%或90%的百分位数,并删除连续元素(例如,不只是从中间删除一个元素,而是从数组的开头和结尾删除x个元素,其中x取决于根据数据确定最佳位置?请使用Javascript

谢谢


ps您需要保存图像以正确查看它

假设数据如下

var data[] = {0.00972, 70, 70, ...};
第一类

data.sort(function(a,b){return a-b});
然后去掉底部的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);
另一种方法是只显示平均值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]);
}
var sum=0;//存储元素的总和
var sumsq=0;//存储平方和

对于(var i=0;iyes)而言,这可能适用于此数据集,但有时数据是正常的(例如,没有与中位数有巨大差距的异常值),我不想切掉2.5%。因此需要一些能够解决这一问题的方法。
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]);
}