Java 求迭代次数最少的均值

Java 求迭代次数最少的均值,java,algorithm,math,statistics,performance,Java,Algorithm,Math,Statistics,Performance,我有一个具有以下特性的测量列表: 测量是昂贵的。更少的测量->更好 他们都是积极的。事实上,有一个正的下限,我不能得到任何低于这个下限的值。这个下限是我需要有信心知道的 它们将分布在一个或多个中值周围 当我发现一个异常值小于中值-2*方差时,我知道还有另一个“更好”的中值,因为“最佳”中值和下限之间的距离总是小于正态分布宽度的两倍 目标:以最少的迭代次数找到最佳中位数,置信度为90% 我更喜欢最小的值,但最小的中值就足够了 我要找的是一段代码,我在其中输入测量值,它告诉我中位数,以及我对这个中位

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

  • 测量是昂贵的。更少的测量->更好
  • 他们都是积极的。事实上,有一个正的下限,我不能得到任何低于这个下限的值。这个下限是我需要有信心知道的
  • 它们将分布在一个或多个中值周围
  • 当我发现一个异常值小于
    中值-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);
    

    在你的例子中,中位数是116000,90%的瓷砖是170000。99%的tile是255000

    我相信实际的问题是:给我一个经过JIT优化的子程序的平均执行情况

    这个过程不是静止的。JIT开始的时间取决于实际的虚拟机实现和被测程序。我相信你不会找到一个通用的魔弹方法


    你必须进行实验。我会尝试扔掉固定数量的测量值,进行固定数量的测量值,扔掉异常值,取其余的平均值。

    考虑在这里发布:我无法提供任何代码,但这似乎可以归类为n武装(或多武装)强盗问题@Kashyap——当你在寻找算法时,stats stackexchange真的不好。我建议改为cs。你是在找中位数吗?对于平均值,你只需要取平均值,只需要一次通过。在你的数据中,中位数是116000。你要找什么号码?对不起,那不行,因为我没有名单。我按照您看到的顺序获取值
    testConnect history.csv
    。我需要一个算法,可以返回
    116000
    ,然后逐行读取文件并在文件结束前停止。另外,我正在寻找运行时的下限,上限是无用的,因为其他进程可能会在未知时间内随时中断我的测量。我可以通过运行几天的测量来获得该值,但我正在寻找一种尽快停止的方法。因此,您需要对延迟进行最乐观的估计。这有什么用?我的目标是在代码的重要部分的运行时更改“太多”时得到警告,其中“太多”取决于许多因素->必须根据情况进行配置。我可以通过运行几分钟的测量来获得期望的结果,但是作为一个人,我可以通过查看16000个值中的大约2000个来查看峰值。计算机怎么能做到这一点呢?在这种情况下,你会遇到一个真正的问题,因为在精确度和你采集的样本数量之间总是有一个权衡。在Java中,您有一个预热,因此您可能必须忽略前10000个或更多样本才能获得一个可重复的数字。您的计时提示您正在计时几毫秒,因此,如果记录/记录的时间超过此时间,您将遇到严重问题。
    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);