我有一个具有以下属性的测量列表:
- 测量费用昂贵。更少的测量 -> 更好
- 他们都是积极的。事实上,有一个正的下限,我无法得到低于该值的任何值。我需要有信心地知道这个下限。
- 它们将围绕一个或多个中值分布
- 当我发现小于
中位数 - 2*方差
的离群值时,我知道还有另一个“更好”中位数,因为“最佳”中位数与下限之间的距离始终较小大于正态分布宽度的两倍
目标:以最少的迭代次数找到最佳中值,置信度为 90%。
我更喜欢最小值,但最小的中位数就足够了。
我正在寻找的是一段代码,我在其中提供测量结果,并告诉我中位数以及该中位数是我所寻找的中位数的置信度。
背景:我想对 Java 方法进行计时。我可以运行几分钟的测试来平均异常值,但在查看数据时,对于人类来说,很明显这些值很快会在中值附近累积。
除非 JIT 启动并且中位数突然跳跃。最终,您将得到一条在最小中位数左侧非常陡峭的曲线(即中位数左侧的方差较低),右侧有一条长而软的斜率,并且在预 JIT 的位置有一个凹凸。中位数是。
testConnect-count.csv
是值的直方图,testConnect-history.csv
是测量序列。目标是找到一种算法,通过从 testConnect-history.csv
115000
左右的较小中位数。
最佳答案
我认为查看延迟的百分位是常见的做法,因为它们不遵循正态分布,并且较长的延迟会对您造成伤害。
在您的情况下,您可以使用第 50 个百分位数和第 90 个百分位数。
如果您有排序的集合,这些计算起来很简单
List<Long> times = ....
Collections.sort(times);
long median = times.get(times.size()/2);
long ninetyth = times.get(times.size()*9/10);
我使用 trove,因为这对于计时敏感的测试来说可以更有效。它使用原始值而不是创建对象。
TLongArrayList times =
times.sort();
long median = times.get(times.size()/2);
long ninetyth = times.get(times.size()*9/10);
long ninetynineth = times.get(times.size()*99/100);
在您的情况下,中位数为 116000,90% 图 block 为 170000。99% 图 block 为 255000
关于java - 用最少的迭代次数求均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409390/