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

标签 javascript algorithm

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

0 附近的数据(它不完全为零,它是 0.00972 等)。

数据在 70 左右开始变得有趣,然后在 100 左右出现巨大的峰值。然后数据继续,然后在另一侧大约 200 处出现同样的情况。

任何人都可以帮助我使用一些算法来消除极端异常值吗?例如给我 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 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]);
}

关于javascript - 删除数组中极端异常值的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663353/

相关文章:

algorithm - 最小化图中的最大距离

algorithm - 动态规划 : Find longest subsequence that is zig zag using only one dp array

algorithm - 寻找5字节PRNG的种子

javascript - 如何在服务器上编写videoJS的错误消息对象

javascript - 正确使用 currentTarget 的点击事件 jQuery

javascript - 除了 First Class Functions 和 Lexical Scoping,JavaScript 与 Scheme 实现有什么共同之处?

javascript - Angular 4-如何仅在其父级完全呈现后才运行指令方法

regex - 根据模板生成所有字符串组合

javascript - 下拉点击按钮无法更改高度

python - 高效算法perl或python