最近在看《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%;平滑慢。图像处理的结果,更加锐利。