假设我有大量数据。
然后我可以把它分成两个找到这两个的平均值并计算我得到的最后2个值的平均值。
a)这是原始数量的平均值吗?
b)我可以用这种方法计算标准差吗?
答案 0 :(得分:2)
a)仅当您划分的集合始终具有相同的大小时,这意味着原始集合大小必须是2的幂。
例如,{6}的平均值为6,{3,6}的平均值为4.5,但{3,6,6}的平均值不是5.25,而是5。
当然,你可以递归地分成几部分来计算总和,然后除以最后的总大小。不确定这对你有什么好处。
b)没有
例如,{2}的s.d为0,s.d。 {1}的值为0,但{1,2}的s.d不为0.
一旦计算了整个集合的平均值,就可以递归地除以计算与平均值的平方和偏差,并且与平均值计算一样,除以总大小并在结尾处取平方根。 [编辑:事实上你需要计算的s.d是sumsquare,sum和count。忘了那个。所以你不必先计算平均值]
答案 1 :(得分:0)
这是不正确的,但是如果可以表示集合的平均值和标准差,则该集合的平均值和标准偏差以及该集合的大小将被分成。
具体来说,如果m_x,s_x和n_x是平均值,标准偏差,x和X的大小被划分为多个x,那么
n_X = sum_x(n_x)
m_X = sum_x(n_x m_x)/n_X
s_X^2 = (sum_x(n_x(s_x^2 + m_x^2)) - m_X)/n_X
假设标准差的形式为sum(x - mean(x))/ n;如果是样本无偏估计,只需相应调整权重。
答案 2 :(得分:0)
开(a) - 如果你精确地将该组分成两个,那么它只是精确正确的。例如,如果存在奇数个项目,则对较小的“一半”有轻微的权重。集合越大,问题就越少。但是,在细分时,问题会再次出现在较小的集合中。将一组三个项目分成单个项目和一对项目时会出现非常大的错误 - 该项目中的每个项目仅比单个项目的最终结果重要一半。
但是,我没有看到收益。你还做了很多补充。你甚至最终做了更多的分工。更重要的是,您以非连续顺序访问内存,导致缓存性能不佳。平均值和标准差的通常方法是首先计算所有项的总和,以及平方和 - 两者都在同一个循环中。旧的计算器用于处理这个与运行总计,也保持计数项目的数量。最后,这三个值(n,x的总和和x平方和)都是你需要的 - 其余的只是替换为平均值和标准差的标准公式。
修改强>
如果为此设置使用递归,请查找“tail recursion”。在数学上,尾递归和迭代是等价的 - 同一事物的不同表示。在实现方面,尾递归可能会导致堆栈溢出,迭代会起作用,但(1)某些语言保证不会发生这种情况(例如Scheme,Haskell),以及(2)许多编译器无论如何都会将其作为优化处理(例如GCC for C或C ++)。
答案 3 :(得分:0)
当然可以。不需要平等的设置,两个的力量。伪代码:
N1,mean1,s1;
N2,mean2,s2;
N12,mean12,s12;
N12 = N1+N2;
mean12 = ((mean1*N1) + (mean2*N2)) / N12;
s12 = sqrt( (s1*s1*N1 + s2*s2*N2) / N12 + N1*N2/(N12*N12)*(s1-s2)*(s1-s2) );
http://en.wikipedia.org/wiki/Weighted_mean
http://en.wikipedia.org/wiki/Standard_deviation#Combining_standard_deviations