是否有一个近似值可以在一个循环中获得平均值和标准偏差

Is there an approximation to get meanvalue and standard deviation in one loop

我有一个包含 n 个浮点值的集合:x[n]。当我想计算平均值和标准偏差时,我需要对所有值进行两次循环迭代:

首先循环对所有值求和并计算平均值:

sum = 0
for(i=0; i<n; i++)
    sum += x[i]
mean = sum/n

在第二个循环中,我计算标准偏差:

sum = 0
for(i=0; i<n; i++)
    sum += pow2(x[i] - mean)
sder = sqrt(sum/n)

我知道,如果您想获得平均值和标准差的精确值,则无法降低这种复杂性。但是,如果您只是近似,是否有一种方法可以在更短的时间内计算出它们?在一个循环中受到青睐。

查看有关标准差的维基百科 this section,特别是最后一个公式导致以下算法:

    sum = 0;
    sumsqrd = 0;

    for(i = 0; i < n; i++)
        sum += x[i]
        sumsqrd += x[i] * x[i]

    mean = sum / n
    stddev = sqrt(sumsqrd / n - mean * mean)

这是一个一次性完成计算的版本,计算更稳定:

mean = 0.0
sum_sqrs = 0.0
n = 0

loop do
  x = get_x()
  break if x == nil
  delta = x - mean
  n += 1
  mean += delta / n
  sum_sqrs += delta * (x - mean)
end
sample_var = sum_sqrs / (n - 1)

这是基于 Rapid calculation methods section of the Wikipedia page for Standard deviation.

下半部分的公式