java - 用最少的迭代次数求均值

标签 java algorithm math statistics performance

我有一个具有以下属性的测量列表:

  1. 测量费用昂贵。更少的测量 -> 更好
  2. 他们都是积极的。事实上,有一个正的下限,我无法得到低于该值的任何值。我需要有信心地知道这个下限。
  3. 它们将围绕一个或多个中值分布
  4. 当我发现小于中位数 - 2*方差的离群值时,我知道还有另一个“更好”中位数,因为“最佳”中位数与下限之间的距离始终较小大于正态分布宽度的两倍

目标:以最少的迭代次数找到最佳中值,置信度为 90%。

我更喜欢最小值,但最小的中位数就足够了。

我正在寻找的是一段代码,我在其中提供测量结果,并告诉我中位数以及该中位数是我所寻找的中位数的置信度。

背景:我想对 Java 方法进行计时。我可以运行几分钟的测试来平均异常值,但在查看数据时,对于人类来说,很明显这些值很快会在中值附近累积。

除非 JIT 启动并且中位数突然跳跃。最终,您将得到一条在最小中位数左侧非常陡峭的曲线(即中位数左侧的方差较低),右侧有一条长而软的斜率,并且在预 JIT 的位置有一个凹凸。中位数是。

Sample test data (13KB)

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/

相关文章:

algorithm - 如何用 n 个矩形近似多边形?

math - 帮助理解单极传递函数

javascript - 为什么这个圆圈内的球不能正常弹跳?

java - 无法执行目标 org.codehaus.mojo :tomcat-maven-plugin:1. 1:运行

java - 如何使用java在网页上执行javascript

java - Camel管道如何与jms端点一起工作

arrays - 总和等于键的数组的最小子集。条件 : Values can be used any number of times

java - BCP 以代码 0 退出

近似整数分配问题最优解的算法

algorithm - 帮忙解答问题