背景
考虑到时间越近的y值对当前要预测的y值的影响更大,采用指数衰减的方式来进行权值赋值。
公式
递推关系式:
α取[0,1]平滑参数,控制权重下降的速度。
代码
# 参数设定
epochs = 20
alpha = 0.5#初始化L 初值L会影响最后的结果
# TSD数据集构造
t = np.linspace(0,10,100)
y = 2*t + np.random.rand(len(t))
# 原始时序数据
plt.figure(figsize=(16, 7))
plt.plot(y)
plt.title("Raw TSD")
plt.show()
# exp smooth
def ExpSmooth(y,t,alpha):
sum = 0
for i in range(t):
sum += alpha*(1-alpha)**i*y[t-i-1]
return sum
# for epoch in range(epochs):#暂未找到自动搜索alpha的方法
# print("Epoch:",epoch+1)
predict = [ExpSmooth(y,i,alpha) for i in range(1,len(y))]
loss = np.mean((predict-y[1:])**2)
print("loss:",loss,"alpha:",alpha)
predict = [ExpSmooth(y,i,alpha) for i in range(1,len(y))]
plt.plot(predict, label='Pred tsd')
plt.plot(y, label='True tsd')
plt.legend(loc=1)
plt.title("tsd Predictions")
plt.show()
loss: 0.2606911228840065 alpha: 0.5
Process finished with exit code 0
执行结果:
结论
思想类似滑动窗口L内平均算法,只不过做了软化,使用权重指数衰减,没有严格割裂较早的值和当前值的关系;
优化可设置窗口L,在窗口内的权重按指数衰减,窗口外与窗口内完全割裂开;
α的值是人为设定的,不是自动搜索更新的,如果可以更新,则类似LSTM的反向传播思想了,根据loss来更新权重。