仓库源文站点原文


layout: post title: 方差算法 categories:


2013-08-04 15:20:43

计算方差时需要对平方进行累加, 因此, 有时会出现数值不稳定和溢出的问题. 好的算法在于能尽量避免这些问题.

简单算法

利用定义

方差 $$\sigma^2 =< x^2 >-< x >^2 = \bar {x^2}-{\bar x}^2 ={1 \over N} \sum\limits_{i=1}^N xi^2 - {1 \over N^2} (\sum\limits{i=1}^N x_i)^2$$

无偏方差 $s^2 = {N \over N-1}\sigma^2$

两步法

先计算出平均值, 再计算方差

$\bar x = { 1\over N }\sum\limits_{i=1}^N x_i$

$\sigma^2={ 1\over N }\sum\limits_{i=1}^N(x_i-\bar x)^2$

上两种算法都存在舍入误差累积问题

校正两步算法(Corrected Two-pass Algorithm)或补偿算法(Compensated Algorithm)

$$\sigma^2 = {1 \over N} \sum\limits_{i=1}^N(xi-\bar x)^2 -{1 \over N^2} [\sum\limits{i=1}^N(x_i-\bar x)]^2$$

若 $\bar x$ 为精确值时, 第二项为零, 否则, 能修正第一项的舍入误差.

实时/在线算法(Online Algorithm)

当采集数据不能全部保存, 只能读取一次时, 可以使用这种递推方法. 计算时保存平均值与方差

$$\bar xn = {(n-1) \bar x{n-1} +xn \over n} = \bar x{n-1}+{xn-\bar x{n-1}}$$

$$\sigman^2 = {(n-1)\sigma{n-1}^2+(xn-\bar x{n-1})(x_n-\bar x_n) \over n}$$

下面是几种常用软件的方差计算方法

测试数据 1 2 3 4

对比可知, 这三种软件给出的都是样本方差的无偏估计 $s^2$ 及其相应的标准差.

参考

  1. Algorithms for calculating variance
  2. Java 实现样本方差的计算