此方法通过基本上假设样本window_size
样本之前的值等于先前的移动平均值来为您提供移动平均值的近似值,该移动平均值在每个window_size
样本中更新。
如果您的值是随机分布的,它会很好地工作,但异常值会使它比精确的移动平均值更偏斜。
previous_average = 0
total = 0
for count, sample in enumerate(samples):
if count % window_size == 0: # Update previous_average every window_size samples
previous_average = total/window_size
total += sample
if count > window_size:
total -= previous_average
current_average = total/window_size
通过 4 点示例,我们可以估计误差:
$\begin{align} y_n = \frac{(a + b + c + d)}{4} &, y_{n+1} = \frac{(a+b+c+d)}{4} + \frac{e}{4} - \frac{a}{4} \\ y*_{n+1} &= \frac{(a + b + c + d) - y_{n} + e}{ 4} \\ &= \frac{(a+b+c+d)}{4} - \frac{(a+b+c+d)}{16} + \frac{e}{4} \\ &= \frac{3(a+b+c+d)}{16} + \frac{e}{4} \\ \end{align}$
$\begin{align} E &= y*_{n+1} - y_{n+1} \\ &= \frac{3a}{16} - \frac{a+b+c+d}{16 } \end{对齐}$
我懒惰地假设任意窗口大小 $W$
$\begin{align} E &= \frac{(W-1)a}{W^2} - \frac{y_n}{W} \\ \end{align}$
如果 $W$ 足够大,则:
$\begin{align} E &\approx \frac{a - y_n}{W} \end{align}$
这是$a$点的残差除以残差总数...
这只是第一次count % window_size == 0
迭代的误差的近似值,我已经在尝试超越我的数学能力,但是由于我们可以从任何 $x_n = a$ 开始,这表明只要 $W$ 足够大或每个 $x_{n} - y_{n}$ 足够小,则此平均值将产生与精确公式拟合相同的平均残差。
我从我的测试脚本中附上了一张图片,显示了与此方法相比的精确 100 点移动平均值: