背景
适用于统计特性不变的场景
公式
简单平均法:使用从开始到当前t时刻所有y的均值作为下一时刻的预测值。
移动平均法:设置滑动窗口长度L。
优化:划分为几个不定长度的时间窗口(按照经验划分,目的是窗口内的均值一致,比如烧烤店的数据在夜晚的部分划为一个窗口,人流量均值明显是高于白天的窗口内计算的均值),各自计算均值,看数据落在哪个窗口内,就用哪个窗口的统计均值来预测t+1时刻的值。或者使用固定长度L的时间窗口,计算t-L到t时刻内的均值,作为t+1时刻的预测值,这样也是变相考虑了相关性的大小,距离当前时刻越近的时刻相关性也就越大。
代码实现
# 参数设定
epochs = 20
L = 10#初始化L 初值L会影响最后的结果
L_MAX = 100
# 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()
# Simple Average
def SimpleAvg(yt_window):
return np.mean(yt_window)
def calc_loss(y,L):
if (L>=len(y)) or (L<=0):
return np.inf
predict = [SimpleAvg(y[i:i + L]) for i in range(len(y) - L)]
loss = np.mean((predict - y[L:]) ** 2)
return loss
for epoch in range(epochs):
print("Epoch:",epoch+1)
predict = [SimpleAvg(y[i:i+L]) for i in range(len(y)-L)]
loss = np.mean((predict-y[L:])**2)
print("loss:",loss,"window Len:",L)
# update L
if calc_loss(y,L+1)<=calc_loss(y,L):
L = L+1
if L-1<=0:
continue
if calc_loss(y,L-1)<=calc_loss(y,L):
L = L-1
predict = [SimpleAvg(y[i:i+L]) for i in range(len(y)-L)]
plt.plot(predict, label='Pred tsd')
plt.plot(y, label='True tsd')
plt.legend(loc=1)
plt.title("tsd Predictions")
plt.show()
# 直接找寻最佳L:
loss_list = [calc_loss(y,l) for l in range(L_MAX)]
L_suitable = np.argmin(loss_list)
print("L_suitable:",L_suitable)
SimpleAvg.py执行日志:
Epoch: 1
loss: 1.3761727615573702 window Len: 10
Epoch: 2
loss: 1.1586547996591674 window Len: 9
Epoch: 3
loss: 0.9581331863985859 window Len: 8
Epoch: 4
loss: 0.7780108593694985 window Len: 7
Epoch: 5
loss: 0.6243939205312278 window Len: 6
Epoch: 6
loss: 0.4839643167484203 window Len: 5
Epoch: 7
loss: 0.37140165470908676 window Len: 4
Epoch: 8
loss: 0.2717009633372139 window Len: 3
Epoch: 9
loss: 0.2060479647215963 window Len: 2
Epoch: 10
loss: 0.18265958525807957 window Len: 1
Epoch: 11
loss: 0.18265958525807957 window Len: 1
Epoch: 12
loss: 0.18265958525807957 window Len: 1
Epoch: 13
loss: 0.18265958525807957 window Len: 1
Epoch: 14
loss: 0.18265958525807957 window Len: 1
Epoch: 15
loss: 0.18265958525807957 window Len: 1
Epoch: 16
loss: 0.18265958525807957 window Len: 1
Epoch: 17
loss: 0.18265958525807957 window Len: 1
Epoch: 18
loss: 0.18265958525807957 window Len: 1
Epoch: 19
loss: 0.18265958525807957 window Len: 1
Epoch: 20
loss: 0.18265958525807957 window Len: 1
L_suitable: 1
Process finished with exit code 0
可见L=1时预测效果最好,拟合程度高主要是因为数据集是直线+rand,而rand的均值=0.
总结
实现了自动长度L搜索功能
算法在L=1时转为朴素的预测算法
y
t
=
y
t
−
1
y_t=y_{t-1}
yt=yt−1
进一步的,在确定了L后,可人为设定权值,比如L=4时,给定[0.40, 0.25, 0.20, 0.15]权值,而不是都取1/4=0.25的权重,自动设定权值则是ARIMA算法的思想。