我有两组统计数据从处理中生成。来自处理的数据可能会有大量的结果,因此我宁愿不必存储所有数据以便稍后重新计算其他数据。合并两个统计结果集
假设我有两组统计数据,它们描述了两个不同的进程运行会话。
每套包含
Statistics : { mean, median, standard deviation, runs on process}
我将如何合并两个的中位数和标准差来获得统计数据的两个描述组的组合摘要。
请记住,我无法保留统计数据所描述的两组数据。
我有两组统计数据从处理中生成。来自处理的数据可能会有大量的结果,因此我宁愿不必存储所有数据以便稍后重新计算其他数据。合并两个统计结果集
假设我有两组统计数据,它们描述了两个不同的进程运行会话。
每套包含
Statistics : { mean, median, standard deviation, runs on process}
我将如何合并两个的中位数和标准差来获得统计数据的两个描述组的组合摘要。
请记住,我无法保留统计数据所描述的两组数据。
你可以得到平均值和标准差,但不是中位数。
new_n = (n(0) + n(1) + ...)
new_mean = (mean(0)*n(0) + mean(1)*n(1) + ...)/new_n
new_var = ((var(0)+mean(0)**2)*n(0) + (var(1)+mean(1)**2)*n(1) + ...)/new_n - new_mean**2
其中n(0)
是运行的第一个数据集的数目,n(1)
是运行在第二数量,依此类推,mean
是平均值,并且var
是方差(这仅仅是标准偏差平方)。 n**2
表示“n平方”。
获得组合方差取决于数据集方差等于数据集平方平均值减去数据集平均值平方的事实。在统计学中,
Var(X) = E(X^2) - E(X)^2
的var(n)+mean(n)**2
条款上面给我们E(X^2)
部分,我们可以再与其他数据集相结合,然后得到期望的结果。
在中位数方面:
如果要结合恰好两个数据集,那么你可以肯定的是,合并正中在于两个中值之间的某处(或等于其中之一),但是有一点你可以说更多。除非你想避免中位数不等于某个数据点,否则取平均值应该没问题。
如果您一次结合多个数据集,则可以采用中位数的中位数,也可以取平均值。如果不同数据集之间可能存在显着的系统差异,那么取平均值可能会更好,因为采用中位数可以减少异常值的影响。但是如果你在运行之间有系统的差异,忽视它们可能不是一件好事。
中位数是不可能的。假设你有两个元组,(1,1,1,2)和(0,0,2,3,3)。 Medians是1和2,总体中位数是1。没办法告诉。
阿蒂尔乌斯在数学上是正确的,但他建议计算方差的方式在数值上不稳定。你要计算方差如下:
new_var=(n(0)*(var(0)+(mean(0)-new_mean)**2) + n(1)*(var(1)+(mean(1)-new_mean)**2) + ...)/new_n
从评论
与原代码的问题编辑的,如果相比,你的意思是你偏差小,你最终会从减去大量大量地获得一个相对较小的数字,这会导致你失去浮点精度。新代码避免了这个问题;而不是转换为E(X^2)并返回,它只是将所有贡献加在一起,并根据样本大小进行适当加权。
好点,但你能扩展一下吗? – Artelius 2009-09-26 09:45:03
当然。原始代码的问题是,如果你的偏差与你的意思相比较小,你最终会从大数中减去一个大数来得到一个相对较小的数字,这将导致你失去浮点精度。新代码避免了这个问题;而不是转换为E(X^2)并返回,它只是将所有贡献加在一起,并根据样本大小进行适当加权。 – comingstorm 2009-09-26 11:34:36
+1为您的答案和评论。两者都是现货,写得很好。 – duffymo 2009-09-26 13:04:46