公式:

# import needed packages
#-----------------------import math
import numpy  as np
import pandas as pdfrom sklearn        import linear_model
from scipy.optimize import fmin_l_bfgs_b# bring in the passenger data from HW4 to test the function against R output
#---------------------------------------------------------------------------
tsA=[12.7, 14.2, 9.6, 9.2, 10.3, 9.3, 7.8, 7.7, 7.4, 6.9, 6.7, 6.9, 6.6]
# define main function [holtWinters] to generate retrospective smoothing/predictions
#-----------------------------------------------------------------------------------def holtWinters(ts, p, sp, ahead, mtype, alpha = None, beta = None, gamma = None):'''HoltWinters retrospective smoothing & future period prediction algorithm both the additive and multiplicative methods are implemented and the (alpha, beta, gamma)parameters have to be either all user chosen or all optimized via one-step-ahead prediction MSDinitial (a, b, s) parameter values are calculated with a fixed-period seasonal decomposition and asimple linear regression to estimate the initial level (B0) and initial trend (B1) values@params:- ts[list]:      time series of data to model- p[int]:        period of the time series (for the calculation of seasonal effects)- sp[int]:       number of starting periods to use when calculating initial parameter values- ahead[int]:    number of future periods for which predictions will be generated- mtype[string]: which method to use for smoothing/forecasts ['additive'/'multiplicative']- alpha[float]:  user-specified level  forgetting factor (one-step MSD optimized if None)- beta[float]:   user-specified slope  forgetting factor (one-step MSD optimized if None)- gamma[float]:  user-specified season forgetting factor (one-step MSD optimized if None)@return: - alpha[float]:    chosen/optimal level  forgetting factor used in calculations- beta[float]:     chosen/optimal trend  forgetting factor used in calculations- gamma[float]:    chosen/optimal season forgetting factor used in calculations- MSD[float]:      chosen/optimal Mean Square Deviation with respect to one-step-ahead predictions- params[tuple]:   final (a, b, s) parameter values used for the prediction of future observations- smoothed[list]:  smoothed values (level + trend + seasonal) for the original time series- predicted[list]: predicted values for the next @ahead periods of the time seriessample calls:results = holtWinters(ts, 12, 4, 24, 'additive')results = holtWinters(ts, 12, 4, 24, 'multiplicative', alpha = 0.1, beta = 0.2, gamma = 0.3)'''a, b, s = _initValues(mtype, ts, p, sp)if alpha == None or beta == None or gamma == None:ituning   = [0.1, 0.1, 0.1]ibounds   = [(0,1), (0,1), (0,1)]optimized = fmin_l_bfgs_b(_MSD, ituning, args = (mtype, ts, p, a, b, s[:]), bounds = ibounds, approx_grad = True)alpha, beta, gamma = optimized[0]MSD, params, smoothed = _expSmooth(mtype, ts, p, a, b, s[:], alpha, beta, gamma)predicted = _predictValues(mtype, p, ahead, params)return {'alpha': alpha, 'beta': beta, 'gamma': gamma, 'MSD': MSD, 'params': params, 'smoothed': smoothed, 'predicted': predicted}def _initValues(mtype, ts, p, sp):'''subroutine to calculate initial parameter values (a, b, s) based on a fixed number of starting periods'''initSeries = pd.Series(ts[:p*sp])if mtype == 'additive':# print(p)rawSeason  = initSeries - initSeries.rolling(window = p, min_periods = p, center = True).mean()initSeason = [np.nanmean(rawSeason[i::p]) for i in range(p)]initSeason = pd.Series(initSeason) - np.mean(initSeason)deSeasoned = [initSeries[v] - initSeason[v % p] for v in range(len(initSeries))]else:rawSeason  = initSeries / initSeries.rolling(window = p, min_periods = p, center = True).mean()initSeason = [np.nanmean(rawSeason[i::p]) for i in range(p)]initSeason = pd.Series(initSeason) / math.pow(np.prod(np.array(initSeason)), 1/p)deSeasoned = [initSeries[v] / initSeason[v % p] for v in range(len(initSeries))]lm = linear_model.LinearRegression()lm.fit(pd.DataFrame({'time': [t+1 for t in range(len(initSeries))]}), pd.Series(deSeasoned))return float(lm.intercept_), float(lm.coef_), list(initSeason)def _MSD(tuning, *args):'''subroutine to pass to BFGS optimization to determine the optimal (alpha, beta, gamma) values'''predicted = []mtype     = args[0]ts, p     = args[1:3]Lt1, Tt1  = args[3:5]St1       = args[5][:]alpha, beta, gamma = tuning[:]for t in range(len(ts)):if mtype == 'additive':Lt = alpha * (ts[t] - St1[t % p]) + (1 - alpha) * (Lt1 + Tt1)Tt = beta  * (Lt - Lt1)           + (1 - beta)  * (Tt1)St = gamma * (ts[t] - Lt)         + (1 - gamma) * (St1[t % p])predicted.append(Lt1 + Tt1 + St1[t % p])else:Lt = alpha * (ts[t] / St1[t % p]) + (1 - alpha) * (Lt1 + Tt1)Tt = beta  * (Lt - Lt1)           + (1 - beta)  * (Tt1)St = gamma * (ts[t] / Lt)         + (1 - gamma) * (St1[t % p])predicted.append((Lt1 + Tt1) * St1[t % p])Lt1, Tt1, St1[t % p] = Lt, Tt, Streturn sum([(ts[t] - predicted[t])**2 for t in range(len(predicted))])/len(predicted)def _expSmooth(mtype, ts, p, a, b, s, alpha, beta, gamma):'''subroutine to calculate the retrospective smoothed values and final parameter values for prediction'''smoothed = []Lt1, Tt1, St1 = a, b, s[:]for t in range(len(ts)):if mtype == 'additive':Lt = alpha * (ts[t] - St1[t % p]) + (1 - alpha) * (Lt1 + Tt1)Tt = beta  * (Lt - Lt1)           + (1 - beta)  * (Tt1)St = gamma * (ts[t] - Lt)         + (1 - gamma) * (St1[t % p])smoothed.append(Lt1 + Tt1 + St1[t % p])else:Lt = alpha * (ts[t] / St1[t % p]) + (1 - alpha) * (Lt1 + Tt1)Tt = beta  * (Lt - Lt1)           + (1 - beta)  * (Tt1)St = gamma * (ts[t] / Lt)         + (1 - gamma) * (St1[t % p])smoothed.append((Lt1 + Tt1) * St1[t % p])Lt1, Tt1, St1[t % p] = Lt, Tt, StMSD = sum([(ts[t] - smoothed[t])**2 for t in range(len(smoothed))])/len(smoothed)return MSD, (Lt1, Tt1, St1), smootheddef _predictValues(mtype, p, ahead, params):'''subroutine to generate predicted values @ahead periods into the future'''Lt, Tt, St = paramsif mtype == 'additive':return [Lt + (t+1)*Tt + St[t % p] for t in range(ahead)]else:return [(Lt + (t+1)*Tt) * St[t % p] for t in range(ahead)]# print out the results to check against R output
#------------------------------------------------results = holtWinters(tsA, 4, 4, 5, mtype = 'additive')
# # results = holtWinters(tsA, 12, 4, 24, mtype = 'multiplicative')print("TUNING: ", results['alpha'], results['beta'], results['gamma'], results['MSD'])
# # print('----')
print("FINAL PARAMETERS: ", results['params'])
print("PREDICTED VALUES: ", results['predicted'])

时间序列之holt-winters(三次指数平滑)相关推荐

  1. java三次指数平滑_时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)

    所有移动平均法都存在很多问题. 它们都太难计算了.每个点的计算都让你绞尽脑汁.而且也不能通过之前的计算结果推算出加权移动平均值. 移动平均值永远不可能应用于现有的数据集边缘的数据,因为它们的窗口宽度是 ...

  2. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息...

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

  3. 时间序列预测方法的使用(简单、加权时序,简单加权移动,一次二次三次指数平滑法)

    先简要介绍 1. 简单序时平均数法 也称算术平均法.即把若干历史时期的统计数值作为观察值,求出算术平均数作为下期预测值.这种方法基于下列假设:"过去这样,今后也将这样",把近期和远 ...

  4. [FormulaExcelPython] 一次指数平滑、二次指数平滑、三次指数平滑(Holt-Winters)...

    指数平滑由移动平均发展而来,和指数移动平均有点相似,也可认为是一种特殊的加权移动平均.按平滑的次数,指数平滑可分为一次指数平滑.二次指数平滑.三次指数平滑.移动平均除了简单预测外另在股市中作为支撑线发 ...

  5. 指数平滑方法(一次指数平滑、二次指数平滑、三次指数平滑):理论、代码、参数 介绍(全)

    @创建于:20210324 @修改于:20210324 文章目录 特别说明 参考来源 包版本号 1.简介 2.一次指数平滑 2.1 理论介绍 2.2 代码展示 2.3 参数介绍 3. 二次指数平滑 3 ...

  6. 一文速学数模-时序预测模型(四)二次指数平滑法和三次指数平滑法详解+Python代码实现

    目录 前言 二次指数平滑法(Holt's linear trend method) 1.定义 2.公式 二次指数平滑值: 二次指数平滑数学模型: 3.案例实现 三次指数平滑法(Holt-Winters ...

  7. 预测算法-三次指数平滑法(Holt-Winters)

    指数平滑 一次指数平滑 一次指数平滑法是一种特殊的加权平均法,对本期观察值和本期预测值赋予不同的权重,求得下一期预测值的方法.这种方法既不需要存储全部历史数据,也不需要存储一组数据,从而可以大大减少数 ...

  8. spss三次指数平滑_选取SPSS中较优指数平滑预测模型的研究.doc

    选取SPSS中较优指数平滑预测模型的研究.doc 选取SPSS中较优指数平滑预测模型的研究 作者简介:张博文(1989-),男,汉族,山东日照人, 安徽理工大学经济与管理学院硕士研究生在读,专业:物流 ...

  9. 三次指数平滑法(Holt-Winters)

    三次指数平滑法 https://blog.csdn.net/qq_32628233/article/details/51595479 ​​ 参数选择 ​α,ß,γ的值都位于[0,1]之间,可以多试验几 ...

最新文章

  1. 从Transformer到BERT模型
  2. Spark详解(十二):Spark Streaming原理和实现
  3. 一篇文章带你了解APP PUSH推送机制
  4. pytorch指定用多张显卡训练_Pytorch多GPU训练
  5. 反射如何拿到私有属性_JAVA中反射机制的价值
  6. AcWing1081.度的数量(数位DP)题解
  7. 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
  8. oauth2基本概念
  9. 树的遍历 ALDS1_7_C:Tree Walk
  10. 从零开始搭建完整的电影全栈系统(六)——影片Api示例、说明及应用
  11. 家庭无线路由器桥接设置
  12. 进程和线程合集以及实例
  13. 视频超分——03 SPMC
  14. yii2框架教程 入门篇(一)
  15. WLAN——一篇让你从0到1了解无线局域网的文章
  16. 同一台服务器上安装mysql5.5和mysql5.7 不同版本的实例
  17. Common Vector Operators(常见的向量操作)
  18. 关于Oralce OAM/OIM及与P6/Unifier 集成SSO的想法
  19. Henry前端笔记之响应式布局与弹性布局
  20. 一些常用函数的拉普拉斯变换

热门文章

  1. echarts图表主题--马卡龙macarons--自己配置主题颜色
  2. 2023金三银四应届生求职面试指南
  3. labuladong 公众号的使用方法
  4. Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)
  5. 2.Paper小结——《Privacy-preserving blockchain-based federated learning for traffic flow prediction》
  6. java将图片存储在数据库(mysql)
  7. 邮件群发平台_招聘平台挑选邮件群发平台时应该注意什么
  8. 【软件下载】换新电脑记录下下载的软件时所需地址
  9. matlab的se是个什么东西
  10. Cell:基于33个遗传多样性水稻种质泛基因组分析揭示“隐藏”的基因组变异