在JavaScript中,根据方差在一组数字中获取高数值

在JavaScript中,根据方差在一组数字中获取高数值,javascript,algorithm,math,numbers,variance,Javascript,Algorithm,Math,Numbers,Variance,我有一个JavaScript代码,它获取一系列数字的最高部分 var sequence = [14, 28, 20, 11, 7, 15, 18]; //all the numbers var generalCap = Math.round(sequence.length / 4); //25% var currenthighs = []; function calculatehighs(strictness) { for(var i=0;i<sequence.length;i++

我有一个JavaScript代码,它获取一系列数字的最高部分

var sequence = [14, 28, 20, 11, 7, 15, 18]; //all the numbers
var generalCap = Math.round(sequence.length / 4); //25%
var currenthighs = [];
function calculatehighs(strictness) {
    for(var i=0;i<sequence.length;i++) {
        var current = sequence[i];
        if(currentHighs.length > generalCap - 1) {
            var match = false;
            for(var n=0;n<currenthighs.length && !match;n++) {
                if(current > currenthighs[n]) {
                    currenthighs.splice(n); //delete one
                    currenthighs.push(current);
                    match = true;
                }
            }
        } else {
            currenthighs.push(current); //if under 25% simply put it in the array
        }
    }
    for(i=0;i<currenthighs.length;i++) {
        var difference = 0;
        for(n=0;n<currenthighs.length;n++) {
            difference += Math.abs(currenthighs[i] - currenthighs[n]);
        }
        if(difference > currenthighs[i] / strictness) {
            currenthighs.splice(i);
        }
    }
}
假设我有一系列10个数字,比如
1,3,4,4,7,15,16,16,30,31
。假设我想得到最高的25%(四舍五入),然后我得到
16,30,31
。但只要看看结果,
16
就不“属于”。理想情况下,我希望得到的结果是
30,31
。(请注意,这只是一个示例;实际上,我有数百组数字,它们的数字都是随机的。)

有没有更好的方法根据方差获取一系列数字的最高部分?然后我所要做的就是指定方差的值,直到我从多组数字中得到我想要的数字。

var-sequence=[14,28,20,11,7,15,18]//所有的数字
var sequence = [14, 28, 20, 11, 7, 15, 18]; //all the numbers
var generalCap = Math.round(sequence.length / 4); //25%
var currenthighs = [];
function calculatehighs(strictness) {
    for(var i=0;i<sequence.length;i++) {
        var current = sequence[i];
        if(currentHighs.length > generalCap - 1) {
            var match = false;
            for(var n=0;n<currenthighs.length && !match;n++) {
                if(current > currenthighs[n]) {
                    currenthighs.splice(n); //delete one
                    currenthighs.push(current);
                    match = true;
                }
            }
        } else {
            currenthighs.push(current); //if under 25% simply put it in the array
        }
    }
    for(i=0;i<currenthighs.length;i++) {
        var difference = 0;
        for(n=0;n<currenthighs.length;n++) {
            difference += Math.abs(currenthighs[i] - currenthighs[n]);
        }
        if(difference > currenthighs[i] / strictness) {
            currenthighs.splice(i);
        }
    }
}
var generalCap=数学圆(sequence.length/4)//25% var currenthighs=[]; 函数计算HIGHS(严格性){ 对于(变量i=0;i通用映射-1){ var匹配=假; 对于(var n=0;n当前高[n]){ currenthighs.splice(n);//删除一个 电流高推压(电流); 匹配=真; } } }否则{ currenthhighs.push(current);//如果低于25%,只需将其放入数组中 } }
对于(i=0;i我猜您想要集合的前25%左右,并且方差应该很低。定义子集及其大小的方差函数。(例如。*方差+abs(sizeOfSubset idealSize))。 现在,从最小的可接受子集开始,迭代到最大的可接受子集。然后选择使函数最小化的子集。这里的关键是正确选择函数,它将对结果产生显著影响。此外,您可能希望规范化方差,因为大数的方差将大于小数的方差因此,样本目标函数(即要最小化的函数)可以


方差/均值+abs(sizeOfSubset idealSize)/totalSize.

你怎么知道
16
不“归属”?会
17
不“归属”?在它被接受之前,你需要达到多高?我想,一旦算法被编写,我可以用一个变量来调整顶部集合中允许的方差。难道不是这样吗?在这个例子中,我只想用一个小集合来轻松地观察它,这是我在eve发布算法之前对几个样本集所做的我有一个ry集。我并不擅长统计学中的术语,否则我肯定会使用正确的术语。我想我是在寻找X个标准偏差值?但集合的顶部,而不是平均值。你需要更清楚地了解你在寻找什么。你说的“最高25%”是什么意思?你的意思是什么“基于方差”?方差是数字与平均值之间的偏差的度量。您示例中的总体方差为16.05…这如何告知您在集合中包含哪些数字?另外,当您说“最高25%(四舍五入)”时,为什么16不在名单中?10的25%是2.5,四舍五入,这是3个数字…如果你选择最高的3个,那就是16、30和31。你是说“根据一些额外的标准,最多,前25%”?在我的例子中,当我抓住前25%时,我确实包括了
16
,我只是想证明有时前25%不起作用,并得到我想要的结果。在这种情况下,16和30之间的差异太大了;在我的例子中,
15,16,16
聚集在一起,然后
30,31
也聚集在一起所以在这个例子中,我想返回
30,31
,因为这样。