📅  最后修改于: 2023-12-03 14:56:04.222000             🧑  作者: Mango
在统计学中,流是指数据一次只接收一个观测值,并且观测值之间的时间间隔不确定的数据序列。流中的数据可以是无限的,因此常常需要动态的计算它们的属性。本文将介绍流中均值和方差的表达式及其实现方法。
流中均值可以用以下公式来表示:
$$ \bar{x_n}=\frac{1}{n}\sum_{i=1}^{n}{x_i} $$
其中,$n$代表数据流的样本个数,$x_i$代表第$i$个样本的取值。表达式的含义是将所有样本的取值加起来,再除以样本个数,即可计算出流的均值。
流中方差的表达式可以使用以下公式来表示:
$$ s_n^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x_n})^2 $$
其中,$s_n^2$ 代表流中样本的方差,$\bar{x_n}$ 代表流的均值,$n$ 代表数据流的样本个数,$x_i$代表第$i$个样本的取值。表达式的含义是,将每个样本的数值与当时的均值作差,求出差值的平方,再将所有的平方和加起来,最后除以样本数减1,即可得出流的方差。
对于流中的数据,我们需要实时计算其均值和方差。这可以通过以下两个算法来实现:
Welford算法是一种用于实时计算数据流的均值和方差的算法。与传统计算均值和方差的公式不同,Welford算法不需要保留所有样本的值,而是通过动态更新样本均值和方差的方式实现。
算法的核心思想是在计算均值和方差时逐个遍历样本,并在每一个新样本到达时更新当前均值、方差和样本数量。Welford算法只需要两个变量即可实现均值和方差的计算,其中 $\bar{x_n}$ 代表当前的样本均值,$s_n^2$ 代表当前的样本方差。
下面是Althon Norby的python实现代码:
class RunningStats:
def __init__(self):
self.n = 0
self.m = 0.0
self.s = 0.0
def add(self, x):
self.n += 1
delta = x - self.m
self.m += delta / self.n
self.s += delta * (x - self.m)
def mean(self):
return self.m
def variance(self):
if self.n > 1:
return self.s / (self.n - 1)
else:
return 0.0
def standard_deviation(self):
return math.sqrt(self.variance())
如果使用Python,也可以使用numpy模块中的rolling方法来计算流的均值和方差。rolling方法用于计算一个滑动窗口内的统计属性,该滑动窗口可以是时间窗口或数据窗口,并且滑动窗口的大小可以是固定的或变化的。
例如下面是一个用于计算滑动窗口均值和方差的代码片段:
import numpy as np
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
mean = np.mean(data)
var = np.var(data)
print("Mean:", mean)
print("Variance:", var)
流中均值和方差是对数据流的描述和分析必不可少的基本统计量。在实时处理大量数据时,使用Welford算法或numpy模块提供的rolling方法,可以实现对流中均值和方差的实时计算,从而更好地应对数据的动态变化。