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