自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 時(shí)間序列預(yù)測(cè):Hot-winters

開(kāi)發(fā) 后端
今天要說(shuō)到Holt-Winters是利用三次指數(shù)平滑來(lái)做時(shí)間序列預(yù)測(cè)的方法。Holt-Winters是綜合了1957年Holt和1960年Winters兩個(gè)人的思路的一種方法。

[[408855]]

Python中文社區(qū)(ID:python-china)

 1. 什么是Holt-Winters

時(shí)間序列是非常常見(jiàn)的數(shù)據(jù)格式,以[時(shí)間,觀測(cè)值]形式表現(xiàn),如下圖。

現(xiàn)實(shí)場(chǎng)景中如股票走勢(shì)圖,國(guó)家GDP歷年數(shù)據(jù),機(jī)器cpu利用率,內(nèi)存數(shù)據(jù)等都是時(shí)間序列。對(duì)未來(lái)時(shí)間的觀測(cè)值進(jìn)行預(yù)測(cè)是有意義的工作,提前預(yù)知未來(lái)的數(shù)據(jù)的走勢(shì),可以提前做出行動(dòng),如預(yù)測(cè)cpu使用率,如果cpu飆高,可以及早進(jìn)行調(diào)整,避免機(jī)器負(fù)載過(guò)高而宕機(jī),這個(gè)在AIOPS是很常見(jiàn)的一個(gè)應(yīng)用場(chǎng)景。

今天要說(shuō)到Holt-Winters是利用三次指數(shù)平滑來(lái)做時(shí)間序列預(yù)測(cè)的方法。Holt-Winters是綜合了1957年Holt和1960年Winters兩個(gè)人的思路的一種方法。

一次指數(shù)平滑 

我們來(lái)看下,一次指數(shù)平滑如下圖:

可知,si表示第i時(shí)刻的平滑估計(jì),si可以表示為當(dāng)前實(shí)際值xi和上一時(shí)刻平滑估計(jì)值得加權(quán)組合,權(quán)重由alpha來(lái)決定。那為什么稱為指數(shù)平滑呢?我們來(lái)把式子展開(kāi),如下:

有點(diǎn)類似泰勒展開(kāi)式的味道

alpha 屬于[0, 1], 越大表示近期的數(shù)據(jù)影響更大

二次指數(shù)平滑:加上趨勢(shì)的因素

一次指數(shù)平滑,沒(méi)有考慮時(shí)間序列的趨勢(shì)和季節(jié)性,二次指數(shù)平滑加上趨勢(shì)因素。

從公式可知,一個(gè)時(shí)間序列的時(shí)刻值分解為baseline部分和趨勢(shì)部分,t表示趨勢(shì),可以表示為連續(xù)兩個(gè)時(shí)刻的差值;可知,ti也是一次的指數(shù)平滑。

Holt-Winters三次指數(shù)平滑:加上季節(jié)性因素 

在二次指數(shù)平滑基礎(chǔ)上,考慮季節(jié)性因素,就是三次指數(shù)平滑,也就是Holt-Winters。由此,一個(gè)時(shí)間序列的時(shí)刻值分解為baseline部分和趨勢(shì)部分以及季節(jié)部分。由于季節(jié)性,存在周期,比如按周,按月等。pi季節(jié)性為當(dāng)前季節(jié)性值和上一個(gè)周期季節(jié)性估計(jì)值的加權(quán)組合,周期在公式中以k來(lái)表示。如下:

2. Holt-Winters的實(shí)現(xiàn)

從第一部分可知,要實(shí)現(xiàn)Holt-Winters,只要知道:

 •  初始值:s0,t0和p0

 •  合適的參數(shù):alpha,beta, gamma

 •  套入公式即可完成預(yù)測(cè)

三個(gè)重要參數(shù):alpha,beta, gamma都屬于[0, 1]之間,要么人為的搜索,要么通過(guò)數(shù)據(jù)來(lái)估計(jì),通常采用L-BFGS優(yōu)化算法來(lái)擬合數(shù)據(jù)。優(yōu)化算法來(lái)自包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. # 優(yōu)化算法的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. # 加性的時(shí)間序列  
  26. def additive(x, m, fc, alpha = Nonebeta = Nonegamma = None):  
  27.     Y = x[:]  
  28. # 利用fmin_l_bfgs_b來(lái)估計(jì)參數(shù)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表示趨勢(shì),s表示季節(jié)性,y表示預(yù)測(cè)值, 分別取第一個(gè)周期的統(tǒng)計(jì)數(shù)據(jù)為初始值  
  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開(kāi)始,fc表示預(yù)測(cè)的數(shù)量,如已知前7天,預(yù)測(cè)接下來(lái)的一個(gè)小時(shí)的數(shù)據(jù),如果數(shù)據(jù)粒度是5分鐘,fc為12。 
  42. for i in range(len(Y) + fc):  
  43. if i == len(Y):  
  44. # 預(yù)測(cè)值為  
  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.  # 計(jì)算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包中也提供的實(shí)現(xiàn)的方法 

  1. from statsmodels.tsa.holtwinters importExponentialSmoothing 

3. Holt-Winters參數(shù)

從上面實(shí)現(xiàn)可知,holt-winters通過(guò)預(yù)估alpha,beta和gamma來(lái)預(yù)測(cè)。算法的關(guān)鍵就是這三個(gè)參數(shù)和初始化值。三個(gè)參數(shù)可以通過(guò)優(yōu)化算法來(lái)預(yù)估,但有可能并不是最優(yōu)的。初始值的設(shè)置除了上面統(tǒng)計(jì)值外,還可以通過(guò)時(shí)序的分解的趨勢(shì)和季節(jié)部分來(lái)初始。 

  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針對(duì)波形比較穩(wěn)定,沒(méi)有突刺的情況下,效果會(huì)比較好。

對(duì)于存在突刺,統(tǒng)一的alpha,beta,gamma不能很好擬合,預(yù)測(cè)可能會(huì)滯后。

4. 總結(jié)

本文分享了時(shí)間序列預(yù)測(cè)算法Holt-Winters以及重要參數(shù)的選擇,希望對(duì)你有幫助。總結(jié)如下:

 •  Holt-Winters是三次指數(shù)平滑,分別為baseline,趨勢(shì)和季節(jié)性;

 •  alpha、beta和gamma分別為baseline,趨勢(shì)和季節(jié)性的指數(shù)加權(quán)參數(shù),一般通過(guò)優(yōu)化算法L-BFGS估計(jì)

 •  初始化可通過(guò)平均值,也可通過(guò)時(shí)間序列分解得到

 •  周期m或者k的選擇要根據(jù)實(shí)際數(shù)據(jù)來(lái)選擇

 •  Holt-Winters針對(duì)波形比較穩(wěn)定,沒(méi)有突刺的情況下,效果會(huì)比較好 

 

責(zé)任編輯:龐桂玉 來(lái)源: Python中文社區(qū)
相關(guān)推薦

2021-07-01 21:46:30

PythonHot-Winters數(shù)據(jù)

2024-05-09 16:23:14

2024-06-27 16:38:57

2024-07-18 13:13:58

2025-01-14 13:32:47

2023-10-13 15:34:55

時(shí)間序列TimesNet

2021-04-07 10:02:00

XGBoostPython代碼

2024-06-17 16:02:58

2022-08-16 09:00:00

機(jī)器學(xué)習(xí)人工智能數(shù)據(jù)庫(kù)

2023-03-16 18:09:00

機(jī)器學(xué)習(xí)數(shù)據(jù)集

2024-10-24 16:46:41

2024-09-04 16:36:48

2023-03-16 07:27:30

CnosDB數(shù)據(jù)庫(kù)

2023-01-30 17:10:23

DeepTime元學(xué)習(xí)

2017-11-20 11:51:40

KerasLSTM深度學(xué)習(xí)

2024-11-15 15:20:00

模型數(shù)據(jù)

2023-12-29 22:37:42

時(shí)間序列NLP

2023-03-27 07:34:28

XGBoostInluxDB時(shí)間序列

2024-05-07 11:46:50

時(shí)間序列概率預(yù)測(cè)

2022-11-24 17:00:01

模型ARDL開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)