目录
介绍
该算法是最初由B.P.Welford于1962年提出的计算样本均值和样本方差的算法。
算法如下1:
初始化 M 1 = x 1 , S 1 = 0 M_1=x_1,S_1=0 M1=x1,S1=0
对于接下来的样本值 x x x,使用递推公式
M k = M k − 1 + x k − M k − 1 k M_k=M_{k-1}+\frac{x_k-M_{k-1}}{k} Mk=Mk−1+kxk−Mk−1
S k = S k − 1 + ( x k − M k − 1 ) ( x k − M k ) S_k=S_{k-1}+(x_k-M_{k-1})(x_k-M_k) Sk=Sk−1+(xk−Mk−1)(xk−Mk)
其中, 2 ⩽ k ⩽ n 2\leqslant{k}\leqslant{n} 2⩽k⩽n,第 k k k个样本方差估计为 s 2 = S k ( k − 1 ) s^2=\frac{S_k}{(k-1)} s2=(k−1)Sk
推导
样本均值2
通常计算均值的方法是
m e a n = t o t a l c o u n t mean=\frac{total}{count} mean=counttotal
用数学符号表达为:
x ˉ = 1 n ∑ i = 1 n x i \bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_{i} xˉ=n1i=1∑nxi
但是传统的计算方法有如下两个弊端:
- 当累积的总和很大,在使用浮点型数据类型时可能造成精度缺失和溢出问题
- 计算时必须保存所有数据
这两个问题可以使用一种增加式方法来解决,当有新值出现,再调整均值和方差。
均值可以表示为前n-1
个值的均值加上最后的新值除以n
:
x ˉ = 1 n ( ∑ i = 1 n − 1 x i + x n ) \bar{x}=\frac{1}{n}(\sum_{i=1}^{n-1}x_{i}+x_{n}) xˉ=n1(i=1∑n−1xi+xn)
其中前n-1个值的均值可以表示为total/sum的形式:
x ˉ n − 1 = ∑ i = 1 n − 1 x i n − 1 \bar{x}_{n-1}=\frac{\sum_{i=1}^{n-1}x_{i}}{n-1} xˉn−1=n−1∑i=1n−1xi
变换该公式:
∑ i = 1 n − 1 x i = ( x ˉ n − 1 ) ( n − 1 ) \sum_{i=1}^{n-1}x_{i}=(\bar{x}_{n-1})(n-1) i=1∑n−1xi=(xˉn−1)(n−1)
使用上式表示前n-1
个值的均值,带入均值计算公式:
x ˉ n = 1 n ( ( n − 1 ) x ˉ n − 1 + x n ) \bar{x}_{n}=\frac{1}{n}((n-1)\bar{x}_{n-1}+x_{n}) xˉn=n1((n−1)xˉn−1+xn)
展开上式:
x ˉ n = n x ˉ n − 1 − x ˉ n − 1 + x n n \bar{x}_{n}=\frac{n\bar{x}_{n-1}-\bar{x}_{n-1}+x_n}{n} xˉn=nnxˉn−1−xˉn−1+xn
变换一下:
x ˉ n = x ˉ n − 1 + x n − x ˉ n − 1 n {\color{DarkRed}\bar{x}_{n}=\bar{x}_{n-1}+\frac{x_n-{\bar{x}}_{n-1}}{n}} xˉn=xˉn−1+nxn−xˉn−1
所以当新增一个值时,新的均值等于旧的均值再加上 x n − x ˉ n − 1 n \frac{x_n-{\bar{x}}_{n-1}}{n}