2.3 指数加权平均
后面的算法需要用到指数加权平均,在统计中也叫指数加权移动平均,所以先讲这个;
老吴生在英国,他拿到了英国去年伦敦每一天的气温数据,比如第一天是40华氏度……用数据作图,结果如下:
如果要计算趋势的话,也就是温度的局部平均值(或者说移动平均值),你要先让,然后之后的每天温度需要用0.9的加权数乘之前一天的温度,在加上0.1的加权数乘以当日温度:
然后按此公式将计算完后画在图中,便得到如红线所示的结果,这个结果叫每日温度的移动平均值,也可以叫指数加权平均值:
那么进一步将的公式更加一般化,把0.9视作一个参数,可以调整成其他值:
在计算时,可视为大概是过去天的平均温度值,比如的话就是过去10天的温度值,而的话就是过去50天的温度值,计算的情况画在图中如绿线所示:
注意到绿线比红线要平坦一些,这是因为你多平均了几十天的温度,所以曲线变得更加平坦,波动更小,缺点是曲线进一步右移了,平均的天数越多,公式在温度变化时适应的速度就会更慢一些,出现了一定的延迟,公式本身在时,只给了当天温度0.02的权重,温度上下起伏变化很大时,指数加权平均就适应得慢一些;
如果取另一个极端点的值,那么就只相当于平均了两天的气温,得到黄线,但由于平均的天数太少,画出的曲线波动很大,噪声更多,更有可能出现异常值,但是这个曲线能够更快地适应温度变化:
是一个重要的超参数,往往存在一个中间值比较好,比如对应红线的,比起绿线和黄线更好地平均了温度。
2.4 理解指数加权平均
也就是说理论上需要是前100天都有关联计算得出,画图的话,假设我们有一些日期的温度,纵轴为,横轴为,将这些天的温度画到图中;然后我们构造一个指数衰减函数,从第一百天对应的指数0.1开始,第99天对应的指数是0.1×0.9,第98天对应,等,于是计算就是通过把两个函数图像对应的元素相乘,然后求和:
但是式子中前面的权重系数加起来逼近于1,我们称之为偏差修正,正是偏差修正才使它成为指数加权平均;
到底需要平均多少天温度?
事实证明,时,,同时,且可以看作,当时,所以换句话说,指数衰减函数大概在10天(对应第90天)时下降到原来高度的,就好像在计算时指数加权平均只关注最近10天的气温值,而10天开外,当天气温对应的权重指数下降到不到三分之一以下,小到可以忽略不计了;
而如果,大约要50次方才能降到约,,我们大约平均了天气温;
以上并不是严谨的数学证明,只是老吴的思考方式;
如何实际执行它呢?
用去表示它是用来计算的指数加权平均数,对应于前面的计算公式,编码:
用for loop的思路写:
所以指数加权平均公式的优点之一是它只占用极少内存,电脑内存中只占一行数字而已,只需要基于,不断把最新的第t天的代入公式里覆盖就可以了,正是这个原因,它基本只占一行代码,计算指数加权平均数也只占单行数字的内存和存储,虽然它不是最好、最精准的计算平均数的方法,如果你要计算一个移动窗口,直接对近10天或50天的气温进行求和,再除以10或50可能给了一个更精确的估计值,但是缺点就是你要保存所有气温值以及近10天气温的总和,占用了更多的内存,更难实现,花费更高;
2.5 指数加权平均的偏差修正
实际上当时,理想曲线如图中的绿线,而实际曲线并不会和理想曲线一样,而是如紫色曲线一样,开始时曲线的起点会比较低:
因为一开始我们设,这就是为何第一天如果是40华氏度,而我们算出的才等于0.8华氏度,得到的值会比真实温度小很多;,算出来的结果仍然要远小于
有什么方法可以改变这一估计?特别是初期?
用代替;比如,时,,于是原来的变为了,这样就进行了偏差的修正使得更接近于真实温度;而随着增加,越来越 接近于1,因此较大时偏差修正几乎没有用,且绿线和紫线基本上重合了;不过,这样的偏差修正对预测初期的曲线能很好地修正,更好地预测温度;
在机器学习中,在计算指数加权平均数的大部分时候,因为人们宁愿熬过初始时期,拿到具有偏差的预测,然后继续计算下去,如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能够帮你在早期获得很好的估测。