文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 时间序列预测:Hot-winters

2024-12-03 02:18

关注

Python中文社区(ID:python-china)

 1. 什么是Holt-Winters

时间序列是非常常见的数据格式,以[时间,观测值]形式表现,如下图。

现实场景中如股票走势图,国家GDP历年数据,机器cpu利用率,内存数据等都是时间序列。对未来时间的观测值进行预测是有意义的工作,提前预知未来的数据的走势,可以提前做出行动,如预测cpu使用率,如果cpu飙高,可以及早进行调整,避免机器负载过高而宕机,这个在AIOPS是很常见的一个应用场景。

今天要说到Holt-Winters是利用三次指数平滑来做时间序列预测的方法。Holt-Winters是综合了1957年Holt和1960年Winters两个人的思路的一种方法。

一次指数平滑 

我们来看下,一次指数平滑如下图:

可知,si表示第i时刻的平滑估计,si可以表示为当前实际值xi和上一时刻平滑估计值得加权组合,权重由alpha来决定。那为什么称为指数平滑呢?我们来把式子展开,如下:

有点类似泰勒展开式的味道

alpha 属于[0, 1], 越大表示近期的数据影响更大

二次指数平滑:加上趋势的因素

一次指数平滑,没有考虑时间序列的趋势和季节性,二次指数平滑加上趋势因素。

从公式可知,一个时间序列的时刻值分解为baseline部分和趋势部分,t表示趋势,可以表示为连续两个时刻的差值;可知,ti也是一次的指数平滑。

Holt-Winters三次指数平滑:加上季节性因素 

在二次指数平滑基础上,考虑季节性因素,就是三次指数平滑,也就是Holt-Winters。由此,一个时间序列的时刻值分解为baseline部分和趋势部分以及季节部分。由于季节性,存在周期,比如按周,按月等。pi季节性为当前季节性值和上一个周期季节性估计值的加权组合,周期在公式中以k来表示。如下:

2. Holt-Winters的实现

从第一部分可知,要实现Holt-Winters,只要知道:

 •  初始值:s0,t0和p0

 •  合适的参数:alpha,beta, gamma

 •  套入公式即可完成预测

三个重要参数:alpha,beta, gamma都属于[0, 1]之间,要么人为的搜索,要么通过数据来估计,通常采用L-BFGS优化算法来拟合数据。优化算法来自包scipy.optimize的fmin_l_bfgs_b。 

  1. from __future__ import division  
  2. from sys importexit  
  3. from math import sqrt  
  4. from numpy import array  
  5. from scipy.optimize import fmin_l_bfgs_b  
  6. # 优化算法的loss function,即判断拟合效果,由RMSE MAE等  
  7. def RMSE(params, *args):  
  8.     Y = args[0]  
  9.     type = args[1] 
  10.     rmse = 0  
  11.     alpha, beta, gamma = params  
  12.     m = args[2]       
  13.     a = [sum(Y[0:m]) / float(m)]  
  14.     b = [(sum(Y[m:2* m]) - sum(Y[0:m])) / m ** 2]  
  15. if type == 'additive':  
  16.         s = [Y[i] - a[0] for i in range(m)]  
  17.         y = [a[0] + b[0] + s[0]]  
  18. for i in range(len(Y)):  
  19.             a.append(alpha * (Y[i] - s[i]) + (1- alpha) * (a[i] + b[i]))  
  20.             b.append(beta * (a[i + 1] - a[i]) + (1- beta) * b[i])  
  21.             s.append(gamma * (Y[i] - a[i] - b[i]) + (1- gamma) * s[i])  
  22.             y.append(a[i + 1] + b[i + 1] + s[i + 1])  
  23.     rmse = sqrt(sum([(m - n) ** 2for m, n in zip(Y, y[:-1])]) / len(Y))  
  24. return rmse  
  25. # 加性的时间序列  
  26. def additive(x, m, fc, alpha = Nonebeta = Nonegamma = None):  
  27.     Y = x[:]  
  28. # 利用fmin_l_bfgs_b来估计参数alpha beta和gamma  
  29. if(alpha == Noneor beta == Noneor gamma == None):  
  30.         initial_values = array([0.3, 0.1, 0.1])  
  31.         boundaries = [(0, 1), (0, 1), (0, 1)]  
  32.         type = 'additive'  
  33.         parameters = fmin_l_bfgs_b(RMSE, x0 = initial_valuesargs = (Y, type, m), bounds = boundariesapprox_grad = True 
  34.         alpha, beta, gamma = parameters[0]  
  35. # 初始值 a表示baseline, b表示趋势,s表示季节性,y表示预测值, 分别取第一个周期的统计数据为初始值  
  36.     a = [sum(Y[0:m]) / float(m)]  
  37.     b = [(sum(Y[m:2* m]) - sum(Y[0:m])) / m ** 2]  
  38.     s = [Y[i] - a[0] for i in range(m)]  
  39.     y = [a[0] + b[0] + s[0]]  
  40.     rmse = 0  
  41. # 套用上面公式,从0开始,fc表示预测的数量,如已知前7天,预测接下来的一个小时的数据,如果数据粒度是5分钟,fc为12。 
  42. for i in range(len(Y) + fc):  
  43. if i == len(Y):  
  44. # 预测值为  
  45.             Y.append(a[-1] + b[-1] + s[-m])  
  46.         a.append(alpha * (Y[i] - s[i]) + (1- alpha) * (a[i] + b[i])) 
  47.          b.append(beta * (a[i + 1] - a[i]) + (1- beta) * b[i])  
  48.         s.append(gamma * (Y[i] - a[i] - b[i]) + (1- gamma) * s[i])  
  49.         y.append(a[i + 1] + b[i + 1] + s[i + 1]) 
  50.  # 计算rmse值  
  51.     rmse = sqrt(sum([(m - n) ** 2for m, n in zip(Y[:-fc], y[:-fc - 1])]) / len(Y[:-fc]))  
  52. return y[-fc:], alpha, beta, gamma, rmse 

另外,statsmodels包中也提供的实现的方法 

  1. from statsmodels.tsa.holtwinters importExponentialSmoothing 

3. Holt-Winters参数

从上面实现可知,holt-winters通过预估alpha,beta和gamma来预测。算法的关键就是这三个参数和初始化值。三个参数可以通过优化算法来预估,但有可能并不是最优的。初始值的设置除了上面统计值外,还可以通过时序的分解的趋势和季节部分来初始。 

  1. import numpy as np  
  2. from pandas import read_csv  
  3. import matplotlib.pyplot as plt  
  4. from statsmodels.tsa.seasonal import seasonal_decompose  
  5. decomposition = seasonal_decompose(df_clean.bw, model='additive'period=288 
  6. decomposition.plot() 

Holt-Winters针对波形比较稳定,没有突刺的情况下,效果会比较好。

对于存在突刺,统一的alpha,beta,gamma不能很好拟合,预测可能会滞后。

4. 总结

本文分享了时间序列预测算法Holt-Winters以及重要参数的选择,希望对你有帮助。总结如下:

 •  Holt-Winters是三次指数平滑,分别为baseline,趋势和季节性;

 •  alpha、beta和gamma分别为baseline,趋势和季节性的指数加权参数,一般通过优化算法L-BFGS估计

 •  初始化可通过平均值,也可通过时间序列分解得到

 •  周期m或者k的选择要根据实际数据来选择

 •  Holt-Winters针对波形比较稳定,没有突刺的情况下,效果会比较好 

 

来源:Python中文社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯