我有两组处理生成的统计信息.来自处理的数据可能是大量结果,因此我宁愿不必存储所有数据以便稍后重新计算其他数据.
假设我有两组统计信息描述了一个进程的两个不同的运行会话.
每组包含
Statistics : { mean, median, standard deviation, runs on process}
Run Code Online (Sandbox Code Playgroud)
如何合并两者的中位数和标准偏差,以获得两个描述统计数据集的综合摘要.
请记住,我无法保留统计信息描述的两组数据.
com*_*orm 25
Artelius在数学上是正确的,但他建议计算方差的方式在数值上是不稳定的.您想要计算方差,如下所示:
new_var=(n(0)*(var(0)+(mean(0)-new_mean)**2) + n(1)*(var(1)+(mean(1)-new_mean)**2) + ...)/new_n
Run Code Online (Sandbox Code Playgroud)
编辑注释
原始代码的问题是,如果你的偏差与你的平均值相比较小,你最终会从一个较大的数字中减去一个较大的数字来得到一个相对较小的数字,这将导致你失去浮点精度.新代码避免了这个问题; 而不是转换为E(X ^ 2)并返回,它只是将总方差的所有贡献加在一起,根据它们的样本大小进行适当加权.
Art*_*ius 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
Run Code Online (Sandbox Code Playgroud)
n(0)第一个数据集中的运行次数在哪里,是第二个数据集中n(1)的运行次数,依此类推,mean是平均值,var是方差(它只是标准偏差的平方).n**2意思是"平方".
获得组合方差依赖于以下事实:数据集的方差等于数据集的平方的平均值减去数据集的平均值的平方.在统计语言中,
Var(X) = E(X^2) - E(X)^2
Run Code Online (Sandbox Code Playgroud)
var(n)+mean(n)**2上面的术语为我们提供了E(X^2)可以与其他数据集合并的部分,然后得到了所需的结果.
就中位数而言:
如果您正在组合两个数据集,那么您可以确定合并中位数介于两个中位数之间(或等于其中一个),但您可以说更多.除非你想避免中位数不等于某个数据点,否则取其平均值应该没问题.
如果您一次性组合多个数据集,您可以采用中位数的中位数,或取其平均值.如果不同的数据集之间可能存在显着的系统差异,那么取其平均值可能更好,因为取中位数会降低异常值的影响.但如果你在跑步之间存在系统性差异,那么忽视它们可能不是一件好事.