我有一个算法可以计算percentile(85)
with Apache Commons
一系列值(12 个值),供以后使用阈值进行评估以做出决定。结果与 Excel 给出的结果类似,但不相等,有时这对我的应用程序至关重要,因为使用 Excel 时结果未通过阈值,而使用 Apache Commons Math 中的结果未通过阈值Java
确实如此,所以我得到不同的输出。
这是一个示例:每 2 小时互联网流量 (Mbps)
32,7076813360000000 41,2580429776000000 45,4453940200000000 48,8044409456000000 46,7462847936000000 49,8028100056000000 5 4,3719451144000000 41,9708134600000000 29,4371963240000000 22,4667255616000000 20,0388452248000000 28,7807757104000000
除以 1000 Mb(电缆容量)后,我计算出占用的百分比 (85):
Excel: 0,049153870117
阿帕奇共享数学:0.05003126676104001
我发现可以更改百分位的实现(它不存在官方的)setPercentileImpl()
,但我找不到任何如何执行此操作的示例,也找不到 Excel 算法(这是我被告知要实现的算法)。
任何有关这方面的帮助都将受到欢迎。
谢谢。
差异是微妙的并且是由于假设造成的。用三元案例最容易解释。假设你有三个元素(N=3)a=x[0] < b=x[1] < c=x[2]
。 Apache 和 Excel 方法都表示元素 b 是第 50 个百分位(中位数)。然而它们的不同之处在于a
and c
.
The 阿帕奇方法 http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/stat/descriptive/rank/Percentile.html (and NIST 页面引用的方法 http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm) say a
是第 25 个百分位数,并且c
是 75% 的百分位数,因为它将空间分为 N+1 个块,即分为四分之一。
Excel 方法表示a
是第 0 个百分位数,并且c
第 100 个百分位数,因为空间被分为 N-1 个块,即一半。
因此,如果您想要 Excel 方法并且不想自己编写代码,您可以从数组中删除最小和最大元素,然后调用 Apache 方法 - 它应该给您完全相同的结果,除了超出终点的百分位数。
如果您想自己编写代码,下面给出了一种简单的方法。请注意以下问题:
- 这对数组进行排序(因此更改它)
- 由于排序,这需要 O(N log(N)) 时间。 Apache 方法使用快速选择算法,因此需要 O(N) 时间(如果您想了解更多信息,请谷歌“quickselect”)
代码(未经测试或什至编译,但应该给您一个想法)。
// warning - modifies data
double excelPercentile(double [] data, double percentile) { array
Arrays.sort(data);
double index = percentile*(data.length-1);
int lower = (int)Math.floor(index);
if(lower<0) { // should never happen, but be defensive
return data[0];
}
if(lower>=data.length-1) { // only in 100 percentile case, but be defensive
return data[data.length-1);
}
double fraction = index-lower;
// linear interpolation
double result=data[lower] + fraction*(data[lower+1]-data[lower]);
return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)