【时间序列预测算法】——平均算法介绍及代码实现

该博客介绍了时间序列预测中简单平均法和移动平均法的应用。通过设置滑动窗口长度L,优化预测效果,并通过迭代寻找最佳窗口长度L,以降低预测误差。在给定的数据集上,发现L=1时预测损失最小,表现为对直线+随机噪声数据的较好拟合。此外,还提出了人为设定权值或采用ARIMA算法进行进一步优化的可能性。
摘要由CSDN通过智能技术生成

背景

适用于统计特性不变的场景

公式

公式
简单平均法:使用从开始到当前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=yt1
进一步的,在确定了L后,可人为设定权值,比如L=4时,给定[0.40, 0.25, 0.20, 0.15]权值,而不是都取1/4=0.25的权重,自动设定权值则是ARIMA算法的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据李菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值