我有两组处理生成的统计信息。来自处理的数据可能是大量结果,因此我宁愿不必存储所有数据以便稍后重新计算其他数据。
假设我有两组统计信息描述了一个进程的两个不同的运行会话。
每组包含
Statistics : { mean, median, standard deviation, runs on process}
如何合并两者的中位数和标准差,以获得两组描述统计数据的综合摘要。
请记住,我无法保留统计信息描述的两组数据。
答案 0 :(得分:24)
Artelius在数学上是正确的,但他建议计算方差的方式在数值上是不稳定的。您想按如下方式计算方差:
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)并返回,它只是将总方差的所有贡献加在一起,根据它们的样本大小进行适当加权。
答案 1 :(得分:21)
您可以获得均值和标准差,但不能得到中位数。
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
1}}是方差(它只是标准偏差的平方)。 n**2
表示“n平方”。
获得组合方差依赖于以下事实:数据集的方差等于数据集的平方的平均值减去数据集的平均值的平方。用统计语言,
Var(X) = E(X^2) - E(X)^2
上面的var(n)+mean(n)**2
条款为我们提供了E(X^2)
部分,然后我们可以将这些部分与其他数据集合并,然后获得所需的结果。
就中位数而言:
如果您正在组合两个数据集,那么您可以确定合并中位数介于两个中位数之间(或等于其中一个),但您可以说更多。取平均值应该没问题,除非你想避免中位数不等于某个数据点。
如果您要一次性组合多个数据集,您可以采用中位数的中位数,或取其平均值。如果不同数据集之间可能存在显着的系统差异,那么取其平均值可能会更好,因为取中位数会降低异常值的影响。但如果你在跑步之间存在系统性差异,那么忽视它们可能不是一件好事。
答案 2 :(得分:3)
中位数是不可能的。假设你有两个元组,(1,1,1,2)和(0,0,2,3,3)。中位数为1和2,总中位数为1.无从告知。