概述
连续计算平均数和方差
问题:对数列
x
[
n
]
x[n]
x[n],计算其平均数
m
[
n
]
m[n]
m[n],方差
v
[
n
]
v[n]
v[n],平均数m[n]为x[1]到x[n]之间数的平均值v[n]为x[1]到x[n]之间的方差
m
[
n
]
=
∑
1
n
(
x
[
i
]
n
)
v
[
n
]
=
∑
i
n
(
(
x
[
i
]
−
m
[
n
]
)
2
n
)
m[n]=sum_1^n(frac{x[i]}{n})\ v[n]=sum_i^n(frac{(x[i]-m[n])^2}{n})
m[n]=1∑n(nx[i])v[n]=i∑n(n(x[i]−m[n])2)
这个问题用通用的方法计算没有问题,但是效率会比较低。因为计算后面的平均数和方差时,前面的数重复累加计算了多次。对于平均数m[n],一个简单的优化方法就是设置一个累加序列s[n],s[i]为x[0]到x[i]之间数的和。这样计算平均数m[n],很容易从s[n]得到,计算方差呢?也可以设置另一个累加序列s2[n],s2[i]为x[0]到x[i]之间数的平方和。
s
[
n
]
=
∑
1
n
(
x
[
i
]
)
m
[
n
]
=
s
[
n
]
n
s
2
[
n
]
=
∑
1
n
x
[
i
]
2
v
[
n
]
=
∑
1
n
x
[
i
]
2
+
n
∗
m
[
n
]
2
−
2
∗
m
[
n
]
∗
∑
1
n
x
[
i
]
n
=
s
2
[
n
]
+
n
∗
m
[
n
]
2
−
2
∗
m
[
n
]
∗
s
[
n
]
n
s[n]=sum_1^n(x[i])\ m[n]=frac{s[n]}{n}\ s2[n]=sum_1^n{x[i]^2}\ v[n]=frac{sum_1^n{x[i]^2}+n*m[n]^2-2*m[n]*sum_1^n{x[i]}}{n}\ =frac{s2[n]+n*m[n]^2-2*m[n]*s[n]}{n}
s[n]=1∑n(x[i])m[n]=ns[n]s2[n]=1∑nx[i]2v[n]=n∑1nx[i]2+n∗m[n]2−2∗m[n]∗∑1nx[i]=ns2[n]+n∗m[n]2−2∗m[n]∗s[n]
但是这种方法需要另外再多加两个数组s[n]和s2[n]。下面介绍一种更好的方法,据说来自Donald Knuth 的《计算机程序设计艺术》第二卷,但是我粗略在这本书中找了一下没有找到。我是在《Learning JavaScript JavaScript Essentials for Modern Application Development》这本书中介绍reduce方法(P140)看到的,觉得这种递推方法很漂亮。下面进行推导:
m
[
n
]
=
∑
1
n
(
x
[
i
]
n
)
=
∑
1
n
−
1
x
[
i
]
+
x
[
n
]
n
=
∑
1
n
−
1
x
[
i
]
n
−
1
∗
n
−
1
n
+
x
[
n
]
n
=
m
[
n
−
1
]
∗
n
−
1
n
+
x
[
n
]
n
=
n
∗
m
[
n
−
1
]
−
m
[
n
−
1
]
+
x
[
n
]
n
=
m
[
n
−
1
]
+
x
[
n
]
−
m
[
n
−
1
]
n
m[n]=sum_1^n(frac{x[i]}{n})\ =frac{sum_1^{n-1}x[i]+x[n]}{n}\ =frac{sum_1^{n-1}x[i]}{n-1}*frac{n-1}{n}+frac{x[n]}{n}\ =m[n-1]*frac{n-1}{n}+frac{x[n]}{n}\ =frac{n*m[n-1]-m[n-1]+x[n]}{n}\ =m[n-1]+frac{x[n]-m[n-1]}{n}
m[n]=1∑n(nx[i])=n∑1n−1x[i]+x[n]=n−1∑1n−1x[i]∗nn−1+nx[n]=m[n−1]∗nn−1+nx[n]=nn∗m[n−1]−m[n−1]+x[n]=m[n−1]+nx[n]−m[n−1]
方差的计算有点区别,先计算其二阶矩。
M
2
[
n
]
=
∑
1
n
(
x
[
i
]
−
m
[
n
]
)
2
=
∑
1
n
(
x
[
i
]
−
m
[
n
−
1
]
−
x
[
n
]
−
m
[
n
−
1
]
n
)
2
=
∑
1
n
(
x
[
i
]
−
m
[
n
−
1
]
)
2
+
(
x
[
n
]
−
m
[
n
−
1
]
)
2
n
−
2
∗
x
[
n
]
−
m
[
n
−
1
]
n
∗
∑
1
n
x
[
i
]
−
m
[
n
−
1
]
=
M
2
[
n
−
1
]
+
(
x
[
n
]
−
m
[
n
−
1
]
)
2
+
(
x
[
n
]
−
m
[
n
−
1
]
)
2
n
−
2
∗
(
x
[
n
]
−
m
[
n
−
1
]
)
2
n
=
M
2
[
n
−
1
]
+
(
x
[
n
]
−
m
[
n
−
1
]
)
2
−
(
x
[
n
]
−
m
[
n
−
1
]
)
2
n
=
M
2
[
n
−
1
]
+
(
x
[
n
]
−
m
[
n
−
1
]
)
∗
(
x
[
n
]
−
m
[
n
−
1
]
−
m
[
n
]
+
m
[
n
−
1
]
)
=
M
2
[
n
−
1
]
+
(
x
[
n
]
−
m
[
n
−
1
]
)
∗
(
x
[
n
]
−
m
[
n
]
)
M2[n]=sum_1^n{(x[i]-m[n])^2}\ =sum_1^n{(x[i]-m[n-1]-frac{x[n]-m[n-1]}{n})^2}\ =sum_1^n{(x[i]-m[n-1])^2}+frac{(x[n]-m[n-1])^2}{n}-2*frac{x[n]-m[n-1]}{n}*sum_1^n{x[i]-m[n-1]}\ =M2[n-1]+(x[n]-m[n-1])^2+frac{(x[n]-m[n-1])^2}{n}-2*frac{(x[n]-m[n-1])^2}{n}\ =M2[n-1]+(x[n]-m[n-1])^2-frac{(x[n]-m[n-1])^2}{n}\ =M2[n-1]+(x[n]-m[n-1])*(x[n]-m[n-1]-m[n]+m[n-1])\ =M2[n-1]+(x[n]-m[n-1])*(x[n]-m[n])
M2[n]=1∑n(x[i]−m[n])2=1∑n(x[i]−m[n−1]−nx[n]−m[n−1])2=1∑n(x[i]−m[n−1])2+n(x[n]−m[n−1])2−2∗nx[n]−m[n−1]∗1∑nx[i]−m[n−1]=M2[n−1]+(x[n]−m[n−1])2+n(x[n]−m[n−1])2−2∗n(x[n]−m[n−1])2=M2[n−1]+(x[n]−m[n−1])2−n(x[n]−m[n−1])2=M2[n−1]+(x[n]−m[n−1])∗(x[n]−m[n−1]−m[n]+m[n−1])=M2[n−1]+(x[n]−m[n−1])∗(x[n]−m[n])
m[n]和M2[n]计算都有一个 x [ n ] − m [ n − 1 ] x[n]-m[n-1] x[n]−m[n−1]项,M2[n]还有一项很相似的 x [ n ] − m [ n ] x[n]-m[n] x[n]−m[n],并且都是累加的形式。虽然计算v[n]还需要先计算M2[n],似乎还是多了一个临时数组。
最后
以上就是陶醉犀牛为你收集整理的对序列连续计算平均数和方差连续计算平均数和方差的全部内容,希望文章能够帮你解决对序列连续计算平均数和方差连续计算平均数和方差所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复