在日常工作中,会碰到需要重复统计某些固定范围的数据,而这些数据往往有以下的特点:
- 数据可能是每天都需要更新;
- 每天的数据量非常大;
- 最终需要快速展示多天数据的统计信息:方差,期望;
- 统计所用内存不能太大;
从以上的条件中可以看到,方差和均值的计算必须是增量式的,不能存储中间的结果;庆幸的是,数学总是很奇妙,可以满足我们磕磕绊绊的需求。
递推公式
平均值计算:
$${ E }{ n }={ E }{ n-1 }+\frac { { X }{ n }-{ E }{ n-1 } }{ n } ,\quad 其中{ E }{ n }=\frac { \sum { i=1 }^{ n }{ { x }{ n } } }{ n } ,{ E }{ n }={ x }_{ 0 }. $$
方差计算:
$$F_{ n }={ F }{ n-1 }+({ x }{ n }-{ F }{ n-1 })({ x }{ n }-{ F }{ n }),\quad { 其中{ { S }{ n } }^{ 2 } }=\frac { { F }{ n } }{ n } =\frac { \sum { i-1 }^{ n }{ { ({ x }{ i }-{ E }{ n }) }^{ 2 } } }{ n } ,{ { S }_{ 0 } }^{ 2 }=0. $$
所以每次迭代都可以直接通过上一次的结果得到当前的平均值和方差,下面给出一些公式的推导。
公式推导
平均值推导
平均值定义:$${ E }_{ n }=\frac { \sum { i=1 }^{ n }{ { x }{ n } } }{ n } ,$$所以可以得到如下推导:
$${ E }{ n }=\frac { \sum { i=1 }^{ n }{ { x }{ n } } }{ n } =\frac { \sum { i=1 }^{ n-1 }{ { x }{ i } } +{ x }{ n } }{ n } =\frac { (n-1)\frac { \sum { i=1 }^{ n-1 }{ { x }{ i } } }{ n-1 } +{ x }{ n } }{ n } =\frac { (n-1){ E }{ n-1 }+{ x }{ n } }{ n } ={ E }{ n-1 }+\frac { { x }{ n }-{ E }{ n-1 } }{ n }$$,
其中其中$${ E }{ 0 }={ x }{ 0 }$$.
方差推导
方差定义: $${ { { S }{ n } }^{ 2 } }=\frac { \sum { i-1 }^{ n }{ { ({ x }{ i }-{ E }{ n }) }^{ 2 } } }{ n } $$.
为了推导方便,令$${ F }{ n }=\sum { i=1 }^{ n }{ { ({ x }{ i }-{ E }{ n }) }^{ 2 } }. $$, 想要获得方差,其实就是需要计算函数F在n处的值,已下给出相关推导:
$${ F }{ n }-{ F }{ n-1 }=\sum { i=1 }^{ n }{ { ({ x }{ i }-{ E }{ n }) }^{ 2 } } -\sum { i=1 }^{ n-1 }{ { ({ x }{ i }-{ E }{ n-1 }) }^{ 2 }= } \sum { i=1 }^{ n }{ { ({ x }{ i }-{ E }{ n-1 }+{ E }{ n-1 }-{ E }{ n }) }^{ 2 } } -\sum { i=1 }^{ n-1 }{ { ({ x }{ i }-{ E }{ n-1 }) }^{ 2 } } $$,
继续展开第一项中的平方:
$${ F }{ n }-{ F }{ n-1 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }+\sum { i=1 }^{ n-1 }{ { ({ x }{ i }-{ E }{ n-1 }) }^{ 2 } } +2({ E }{ n-1 }-{ E }{ n })\sum { i=1 }^{ n }{ ({ x }{ i }-{ E }{ n-1 }) } +\sum { i=1 }^{ n }{ { ({ E }{ n-1 }-{ E }{ n }) }^{ 2 } } -\sum { i=1 }^{ n-1 }{ { ({ x }{ i }-{ E }{ n-1 }) }^{ 2 } } $$,
第二项和第五项消掉并且直接计算第三四项求和:
$${ F }{ n }-{ F }{ n-1 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }+2({ E }{ n-1 }-{ E }{ n })({ nE }{ n }-{ nE }{ n-1 })+{ n({ E }{ n-1 }-{ E }{ n }) }^{ 2 }$$,
根据平均值的计算可以推导如下:
$${ E }{ n }={ E }{ n-1 }+\frac { { x }{ n }-{ E }{ n-1 } }{ n } \Rightarrow n{ E }{ n }=n{ E }{ n-1 }+{ x }{ n }-{ E }{ n-1 }\Rightarrow n({ E }{ n }-{ E }{ n-1 })={ x }{ n }-{ E }{ n-1 }$$,
带入上一步第二项化简:
$${ F }{ n }-{ F }{ n-1 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }+2({ x }{ n }-{ E }{ n-1 })({ E }{ n-1 }-{ E }{ n })+{ n({ E }{ n-1 }-{ E }{ n }) }^{ 2 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }-2({ x }{ n }-{ E }{ n-1 })({ E }{ n }-{ E }{ n-1 })+{ n({ E }{ n }-{ E }{ n-1 }) }^{ 2 }$$,
后面两项提出公因式后:
$${ F }{ n }-{ F }{ n-1 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }+({ E }{ n }-{ E }{ n-1 }){ [-2x }{ n }+2{ E }{ n-1 }+n({ E }{ n }-{ E }{ n-1 })]$$,
带入均值推导公式的第二个推导式并化简:
$${ F }{ n }-{ F }{ n-1 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }+({ E }{ n }-{ E }{ n-1 }){ [{ E }{ n-1 }-x }{ n }]$$,
整理顺序看起来更加清晰:
$${ F }{ n }-{ F }{ n-1 }={ ({ x }{ n }-{ E }{ n-1 }) }^{ 2 }-({ x }{ n }-{ E }{ n-1 })({ E }{ n }-{ E }{ n-1 })$$,
提取公因式获得最终的最简式:
$${ F }{ n }-{ F }{ n-1 }=({ x }{ n }-{ E }{ n-1 })({ x }{ n }-{ E }{ n })$$,
因此可以得到如下公式:
$${ F }{ n }={ F }{ n-1 }+({ x }{ n }-{ E }{ n-1 })({ x }{ n }-{ E }{ n })$$,
其中$${ F }_{ 0 }={ 0 }$$.
证毕.
编码实现
java版本
(未完待续)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com