Welford算法的推导和实现

介绍

该算法是最初由B.P.Welford于1962年提出的计算样本均值和样本方差的算法。
算法如下1

初始化 M 1 = x 1 , S 1 = 0 M_1=x_1,S_1=0 M1=x1S1=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=Mk1+kxkMk1
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=Sk1+(xkMk1)(xkMk)

其中, 2 ⩽ k ⩽ n 2\leqslant{k}\leqslant{n} 2kn,第 k k k个样本方差估计为 s 2 = S k ( k − 1 ) s^2=\frac{S_k}{(k-1)} s2=(k1)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=1nxi
但是传统的计算方法有如下两个弊端:

  • 当累积的总和很大,在使用浮点型数据类型时可能造成精度缺失和溢出问题
  • 计算时必须保存所有数据

这两个问题可以使用一种增加式方法来解决,当有新值出现,再调整均值和方差。

均值可以表示为前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=1n1xi+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ˉn1=n1i=1n1xi
变换该公式:
∑ 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=1n1xi=(xˉn1)(n1)
使用上式表示前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((n1)xˉn1+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ˉn1xˉn1+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ˉn1+nxnxˉn1
所以当新增一个值时,新的均值等于旧的均值再加上 x n − x ˉ n − 1 n \frac{x_n-{\bar{x}}_{n-1}}{n}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值