让我们有一个正在运行的数字流 x 1 ,x 2 ,x 3 ,…,x n 。
计算任何给定点的均值和方差的公式如下:
- 平均值 = E(x) = u = 1 / n ∑ i=1 n x i
- 标准偏差 = s = 1 / n ∑ i=1 n (x i – u) 2
- 方差 = s 2
但是,如果我们通过在每次输入新数字时循环遍历所有数字来计算这些表达式,那将是一种非常缓慢的方法。
有效的解决方案
s2 = 1/n ∑i=1n (xi - u) 2
= 1/n (∑i=1n xi2 + ∑i=1n u2 - 2u ∑i=1n xi)
= 1/n (∑xi2 + nu2 - 2u ∑xi)
= ∑xi2/n + u2 - 2u ∑xi/n
= ∑xi2/n - u2
= E(x2) - u2
= E(x2) - [E(x)]2
因此,在这个实现中,我们必须为均值维护所有当前数字的可变总和,并为 E(x 2 ) 维护所有当前数字的可变总和2 ,我们必须为存在的数字维护另一个变量 n .
Python代码:
Python3
sum=0 # To store sum of stream
sumsq=0 # To store sum of square of stream
n=0 # To store count of numbers
while(True):
x=int(input("Enter a number : "))
n+=1
sum+=x
sumsq+=(x*x)
#Mean
mean = sum/n
#Variance
var = (sumsq/n) - (mean*mean)
print("Mean : ",mean)
print("Variance : ",var)
print()
Input and corresponding output :
Enter a number : 1
Mean : 1.0
Variance : 0.0
Enter a number : 2
Mean : 1.5
Variance : 0.25
Enter a number : 5
Mean : 2.6666666666666665
Variance : 2.8888888888888893
Enter a number : 4
Mean : 3.0
Variance : 2.5
Enter a number : 3
Mean : 3.0
Variance : 2.0
因此,我们可以在恒定时间的任何给定点计算运行流的均值和方差。