python深度学习中指数移动平均值的计算代码问题

最近在看《python深度学习》,其中3.6提到了用指数移动平均值来得到光滑的曲线:

def smooth_curve(points, factor=0.9):
  smoothed_points = []
  for point in points:
    if smoothed_points:
      previous = smoothed_points[-1]
      smoothed_points.append(previous * factor + point * (1 - factor))
    else:
      smoothed_points.append(point)
  return smoothed_points

smooth_mae_history = smooth_curve(average_mae_history[10:])

plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

百度了一下,指数移动平均值的计算公式应该是:

EMAtoday=α * Pricetoday + ( 1 - α ) * EMAyesterday;

如果按照这个公式,计算代码应为:

factor * point + (1 - factor) * previous

而非书中提到的:

previous * factor + point * (1 - factor)

想请教下,是书上错了还是我理解错了?还想请教下factor=0.9时怎么得出的?

你提到的这两个算法是一样的啊,只不过其中一个的factor在另一个里是1-factor。
0.9只不过是作者取得一个默认值,你要是想换可以自己改,没什么怎么得出的。
没人会问你一天三顿饭的3是怎么得出的,让你列计算过程。

这两个alpha滤波公式本质上是一样的:
1)previous * factor + point * (1 - factor)
2)factor * point + (1 - factor) * previous
但是需要看这个系数的大小;容易导致含义出现偏差。

举例系数=0.1:
第一个公式含义是:前一个点占10%,当前点占90%;平滑快。图像处理的结果,更加模糊。
第二个公式含义是:当前值占10%,前一个值占90%;平滑慢。图像处理的结果,更加锐利。