成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 時間序列預測:Hot-Winters

開發 后端
今天要說到Holt-Winters是利用三次指數平滑來做時間序列預測的方法。Holt-Winters是綜合了1957年Holt和1960年Winters兩個人的思路的一種方法。

[[408747]]

本文轉載自微信公眾號「Python中文社區」,作者wedo實驗君。轉載本文請聯系Python中文社區公眾號。

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 = None, beta = None, gamma = 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_values, args = (Y, type, m), bounds = boundaries, approx_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以及重要參數的選擇,希望對你有幫助??偨Y如下:

  • Holt-Winters是三次指數平滑,分別為baseline,趨勢和季節性;
  • alpha、beta和gamma分別為baseline,趨勢和季節性的指數加權參數,一般通過優化算法L-BFGS估計
  • 初始化可通過平均值,也可通過時間序列分解得到
  • 周期m或者k的選擇要根據實際數據來選擇
  • Holt-Winters針對波形比較穩定,沒有突刺的情況下,效果會比較好

 

作者簡介:wedo實驗君, 數據分析師;熱愛生活,熱愛寫作

 

責任編輯:武曉燕 來源: Python中文社區
相關推薦

2021-07-02 10:05:45

PythonHot-winters指數平滑

2024-05-09 16:23:14

2024-06-27 16:38:57

2024-07-18 13:13:58

2025-01-14 13:32:47

2021-04-07 10:02:00

XGBoostPython代碼

2023-10-13 15:34:55

時間序列TimesNet

2022-08-16 09:00:00

機器學習人工智能數據庫

2024-06-17 16:02:58

2023-03-16 18:09:00

機器學習數據集

2023-03-16 07:27:30

CnosDB數據庫

2024-09-04 16:36:48

2024-10-24 16:46:41

2023-01-30 17:10:23

DeepTime元學習

2017-11-20 11:51:40

KerasLSTM深度學習

2024-11-15 15:20:00

模型數據

2023-03-27 07:34:28

XGBoostInluxDB時間序列

2023-12-29 22:37:42

時間序列NLP

2024-05-07 11:46:50

時間序列概率預測

2022-11-24 17:00:01

模型ARDL開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 玖玖色在线视频 | 久久er精品 | 在线欧美亚洲 | 久久久精品视频免费 | 免费观看一级视频 | 91看片视频 | 精品免费视频 | 极品粉嫩国产48尤物在线播放 | 国产亚洲欧美日韩精品一区二区三区 | 成人久久18免费网站 | 在线免费观看黄a | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 网站黄色av | 日韩精品成人av | 超碰免费观看 | 久久久久91| 亚洲免费久久久 | 国产清纯白嫩初高生在线播放视频 | 天天色影视综合 | 操操日| 亚洲一区二区欧美 | a a毛片| 91玖玖| 亚洲免费精品 | 狠狠干天天干 | 国产区在线观看 | 精品成人 | 久久国产精品久久 | 99re在线视频观看 | 日韩精品一区二区三区视频播放 | 欧美综合一区二区三区 | 色资源在线视频 | 亚洲国产成人在线视频 | 国产精品视频网 | 精品一区二区三区不卡 | 久久国际精品 | 久久久久久精 | 全免一级毛片 | 国产欧美日韩精品一区 | 伊人久久大香线 | 中文字幕一区二区三区在线观看 |