我们有分析代码,它收集方法的持续时间以及一堆其他数据点,我们将这些数字存储在来自 commons 数学的 SummaryStatistics 对象中,以提供最小值、最大值、平均值、计数等。但是我们需要将此对象刷新到每隔一小时左右磁盘一次,然后再次开始收集下一个。
我的问题是我们如何才能可靠地将这些值加在一起,所以如果我们有 24 个汇总统计对象,我们可以在不扭曲数据的情况下显示一整天的汇总?对象本身具有运行平均值以及计数的项目数,那么是否有一个实用程序类可以组合两个加权平均值?
我们有分析代码,它收集方法的持续时间以及一堆其他数据点,我们将这些数字存储在来自 commons 数学的 SummaryStatistics 对象中,以提供最小值、最大值、平均值、计数等。但是我们需要将此对象刷新到每隔一小时左右磁盘一次,然后再次开始收集下一个。
我的问题是我们如何才能可靠地将这些值加在一起,所以如果我们有 24 个汇总统计对象,我们可以在不扭曲数据的情况下显示一整天的汇总?对象本身具有运行平均值以及计数的项目数,那么是否有一个实用程序类可以组合两个加权平均值?
您也可以使用AggregateSummaryStatistics直接执行此操作。请参阅Commons Math 用户指南的统计部分中标题为“同时计算多个样本的统计数据和整体统计数据”的部分。
既然你说你有平均值和计数,你想使用的一般公式是将平均值的乘积除以它们的计数,然后除以它们的计数总和。
例如,对于两个SummaryStatistics
对象A
和B
,您将使用:
double weightedMean = (A.getMean() * A.getN() + B.getMean() * B.getN()) /
(A.getN() + B.getN());
对于他们中的许多人(例如,List
其中一个称为“manyStats”),您可能会执行以下操作:
double accum = 0.0;
long n = 0;
for (SummaryStatisics s: manyStats) {
accum += s.getMean() * s.getN();
n += s.getN();
}
double weightedMean = accum / n;