计算方差的算法 (Algorithms for calculating variance)

简单算法

最直接的计算方差的方法是“一次通过”算法。它首先计算所有数据的平均值,然后计算每个数据点与平均值的差的平方,最后将这些平方差求和并除以样本数量 (对于总体方差) 或者样本数量减一 (对于样本方差)。

这种算法的优点是简单易懂,易于实现。但是,当数据量很大,或者数据差异很大时,这种算法容易受到数值计算溢出的影响,导致计算结果不准确。特别是,在计算每个数据点与平均值的差时,如果平均值与数据点本身的值相差很大,计算结果的精度会下降。

改进的“一次通过”算法

为了解决简单算法的数值稳定性问题,可以对“一次通过”算法进行改进。一个常用的改进方法是使用“累加和”和“累加平方和”来计算。 这种方法减少了对中间变量的精度要求,提高了计算结果的准确性。

这种算法的计算过程可以描述如下:

  • 初始化: sum = 0, sq_sum = 0, count = 0
  • 对于每个数据点 x:
    • sum += x
    • sq_sum += x*x
    • count++
  • 方差 = (sq_sum – sum*sum/count) / (count-1) (样本方差) 或者 方差 = (sq_sum – sum*sum/count) / count (总体方差)

尽管这种改进算法比简单算法更稳定,但它仍然可能在计算数据量非常大,且均值接近零的情况下,由于减法运算导致精度损失。

在线算法

在线算法是指在数据不断输入的情况下,可以实时更新方差的算法。这种算法特别适用于数据流处理,因为它不需要事先知道所有数据。 Welford 算法是一种流行的在线算法,它在每次接收到新数据时,都会更新平均值和方差。

Welford算法的公式如下:

  • 初始化: mean = 0, M2 = 0, count = 0
  • 对于每个数据点 x:
    • count++
    • delta = x – mean
    • mean = mean + delta/count
    • M2 = M2 + delta * (x – mean)
  • 方差 = M2 / (count – 1) (样本方差) 或者 方差 = M2 / count (总体方差)

Welford算法的优点在于数值稳定性好,即使数据量很大,也能保持较高的精度。它也只需要遍历一次数据,并且不需要存储所有数据,因此空间复杂度较低。

加权方差的计算

除了计算普通方差,有时还需要计算加权方差,即每个数据点都有一个权重。 加权方差的计算方法与普通方差类似,但需要在计算平均值和方差时考虑权重。加权方差的公式会根据权重类型(频率权重或可靠性权重)而有所不同,常见的加权方差算法也容易受到数值稳定性的影响。 在实现时,需要仔细选择算法,以保证计算结果的准确性。

结论

计算方差的算法多种多样,每种算法都有其优缺点。简单算法易于理解,但精度可能较低;改进的“一次通过”算法在一定程度上提高了精度;在线算法(如Welford算法)具有较好的数值稳定性和较低的空间复杂度,适用于数据流处理;加权方差的计算则需要考虑权重的类型。在选择算法时,需要根据具体应用场景、数据量、数据分布以及对计算精度的要求,综合考虑。在实际应用中,应该尽量选择数值稳定性好的算法,以保证计算结果的准确性。

参考资料