趋势预测方法(五)Holt-Winters模型_时序递推预测
Holt-Winters模型
a基本原理:
该方法有点类似于MA(移动平均)的思路,是对MA的优化。主要因为MA的参数数量过多时,计算时间慢,且计算复杂。Holt-Winters利用三次指数平滑法,将历史时序数据输入三个递推序列,再由三个序列的递推值来推算出预测数据的值。该模型的目的是训练出三次指数平滑法三个因数的最有效的取值,之后就可以继续预测了。
该方法可以有效的预测有线性趋势和周期波动的非平稳序列。
b模型原理:
简单指数平滑:
二次指数平滑:
三次指数平滑:
在二次指数平滑的基础上加入了季节性(周期性)特征指数平滑队列。
季节性被定义为时间序列数据的趋势,它表现出每一个周期重复自身的行为,就像任何周期函数一样。
在自然界中有两种不同类型的三次指数平滑,它们是“累加性”三次指数平滑和“累乘性”三次指数平滑。
c算法入口:
scipy.optimize.fmin_l_bfgs_b(func,x0,args=(),bounds=None, *args)
fmin_l_bfgs_b函数是用来进行L-BFGS优化的,利用最小二乘法来优化参数
func为原函数
x0为模型的初始参数
args为传入func的参数
bounds为模型参数的取值范围
d实例参考:
'''Holt-Winters模型模板使用最小二乘法来找出最优alpha,beta,Gamma
'''from sys import exit
from math import sqrt
from numpy import array
from scipy.optimize import fmin_l_bfgs_b# 均方根误差函数(最小二乘法)
def RMSE(params, *args): # args=[X,type,(m)]X = args[0]type = args[1]if type == 'linear': # 若趋势是线性的(非周期)try: # 设定参数初始化值和S0、B0、F0值alpha, beta = paramss = [X[0]]b = [X[1] - X[0]]f = [s[0] + b[0]]# 利用历史数据递推迭代for i in range(len(X)):s.append(alpha * X[i] + (1 - alpha) * (s[i] + b[i]))b.append(beta * (s[i + 1] - s[i]) + (1 - beta) * b[i])f.append(s[i + 1] + b[i + 1])except: # 参数有误print('params error')else: # 趋势非线性(周期)try: # 设定参数初始化值和S0、B0值,m为需要预测的时间长度alpha, beta, gamma = paramsm = args[2]s = [sum(X[0:m]) / float(m)]b = [(sum(X[m:2 * m]) - sum(X[0:m])) / m ** 2]if type == 'additive': # 加法性# 设定c0、F0值c = [X[i] - s[0] for i in range(m)]f = [s[0] + b[0] + c[0]]# 利用历史数据递推迭代for i in range(len(X)):s.append(alpha * (X[i] - s[i]) + (1 - alpha) * (s[i] + b[i]))b.append(beta * (s[i + 1] - s[i]) + (1 - beta) * b[i])c.append(gamma * (X[i] - s[i] - b[i]) + (1 - gamma) * c[i])f.append(c[i + 1] + b[i + 1] + s[i + 1])elif type == 'multiplicative': # 乘法性# 设定c0、F0值c = [X[i] / s[0] for i in range(m)]f = [(s[0] + b[0]) * c[0]]# 利用历史数据递推迭代for i in range(len(X)):s.append(alpha * (X[i] / c[i]) + (1 - alpha) * (s[i] + b[i]))b.append(beta * (s[i + 1] - s[i]) + (1 - beta) * b[i])s.append(gamma * (X[i] / (s[i] + b[i])) + (1 - gamma) * c[i])f.append((c[i + 1] + b[i + 1]) * s[i + 1])else: # type类型有误exit('Type must be either linear, additive or multiplicative')except: # 参数或args有误print('params or args error')# 计算均方根误差rmse = sqrt(sum([(m - n) ** 2 for m, n in zip(X, f[:-1])]) / len(X))return rmsedef linear(x, fc, alpha=None, beta=None): # 趋势线性,fc为要预测数据的数量X = x[:]if (alpha == None or beta == None):initial_values = array([0.3, 0.1]) # 如果alpha或beta存在None,那重新一个随机值boundaries = [(0, 1), (0, 1)] # alpha和beta的取值范围type = 'linear'parameters = fmin_l_bfgs_b(RMSE, x0=initial_values, args=(X, type), bounds=boundaries, approx_grad=True)alpha, beta = parameters[0] # 获得最优的alpha和beta# 初始化s,b,f队列,准备预测[len(X)+1,len(X)+fc]这一段数据s = [X[0]]b = [X[1] - X[0]]f = [s[0] + b[0]]for i in range(len(X) + fc):if i == len(X): # 如果历史数据已用完,则添加最近的预测数据的xX.append(s[-1] + b[-1])s.append(alpha * X[i] + (1 - alpha) * (s[i] + b[i]))b.append(beta * (s[i + 1] - s[i]) + (1 - beta) * b[i])f.append(s[i + 1] + b[i + 1])rmse = sqrt(sum([(m - n) ** 2 for m, n in zip(X[:-fc], X[:-fc - 1])]) / len(X[:-fc]))return X[-fc:], alpha, beta, rmse # 输出预测值,alpha,beta,最小均方根误差def additive(x, m, fc, alpha=None, beta=None, gamma=None): # 累加性X = x[:]if (alpha == None or beta == None or gamma == None):initial_values = array([0.3, 0.1, 0.1]) # 如果alpha或beta存在None,那重新一个随机值boundaries = [(0, 1), (0, 1), (0, 1)] # alpha和beta、gamma的取值范围type = 'additive'parameters = fmin_l_bfgs_b(RMSE, x0=initial_values, args=(X, type, m), bounds=boundaries, approx_grad=True)alpha, beta, gamma = parameters[0] # 获得最优的alpha和beta、gamma# 初始化s,b,c,f队列,准备预测[len(X)+1,len(X)+fc]这一段数据s = [sum(X[0:m]) / float(m)]b = [(sum(X[m:2 * m]) - sum(X[0:m])) / m ** 2]c = [X[i] - s[0] for i in range(m)]f = [s[0] + b[0] + c[0]]for i in range(len(X) + fc):if i == len(X): # 如果历史数据已用完,则添加最近的预测数据的xX.append(s[-1] + b[-1] + c[-m])s.append(alpha * (X[i] - c[i]) + (1 - alpha) * (s[i] + b[i]))b.append(beta * (s[i + 1] - s[i]) + (1 - beta) * b[i])c.append(gamma * (X[i] - s[i] - b[i]) + (1 - gamma) * c[i])f.append(c[i + 1] + b[i + 1] + s[i + 1])rmse = sqrt(sum([(m - n) ** 2 for m, n in zip(X[:-fc], f[:-fc - 1])]) / len(X[:-fc]))return X[-fc:], alpha, beta, gamma, rmse # 输出预测值,alpha,beta,gamma最小均方根误差def multiplicative(x, m, fc, alpha=None, beta=None, gamma=None): # 累乘性X = x[:]if (alpha == None or beta == None or gamma == None):initial_values = array([0.0, 1.0, 0.0]) # 如果alpha或beta存在None,那重新一个随机值boundaries = [(0, 1), (0, 1), (0, 1)] # alpha和beta、gamma的取值范围type = 'multiplicative'parameters = fmin_l_bfgs_b(RMSE, x0=initial_values, args=(X, type, m), bounds=boundaries, approx_grad=True)alpha, beta, gamma = parameters[0] # 获得最优的alpha和beta、gamma# 初始化s,b,c,f队列,准备预测[len(X)+1,len(X)+fc]这一段数据s = [sum(X[0:m]) / float(m)]b = [(sum(X[m:2 * m]) - sum(X[0:m])) / m ** 2]c = [X[i] / s[0] for i in range(m)]f = [(s[0] + b[0]) * c[0]]for i in range(len(X) + fc):if i == len(X): # 如果历史数据已用完,则添加最近的预测数据的xX.append((s[-1] + b[-1]) * c[-m])s.append(alpha * (X[i] / c[i]) + (1 - alpha) * (s[i] + b[i]))b.append(beta * (s[i + 1] - s[i]) + (1 - beta) * b[i])c.append(gamma * (X[i] / (s[i] + b[i])) + (1 - gamma) * c[i])f.append((s[i + 1] + b[i + 1]) * c[i + 1])rmse = sqrt(sum([(m - n) ** 2 for m, n in zip(X[:-fc], f[:-fc - 1])]) / len(X[:-fc]))return X[-fc:], alpha, beta, gamma, rmse # 输出预测值,alpha,beta,gamma最小均方根误差
e参考文献:
Holt-Winters模型原理分析及代码实现(python) https://blog.csdn.net/u010665216/article/details/78051192
Holt-Winters与时间序列预测 https://www.jianshu.com/p/fcd20a048adb
时间序列分析之指数平滑法(holt-winters及代码)https://zhuanlan.zhihu.com/p/43353740
趋势预测方法(五)Holt-Winters模型_时序递推预测相关推荐
- 趋势预测方法(三)ARMA ARIMA SARIMA模型预测_时序递推预测
ARMA/ARIMA/SARIMA模型预测 a基本原理: 这三种模型都是用来预测时序性数据.其中ARIMA和SARIMA是由ARMA模型演变过来的,而ARMA是由AR模型(自回归模型)和MA模型(移动 ...
- 趋势预测方法(四)高斯过程回归_时序概率性预测
高斯过程回归(GPR) a基本原理: 利用高斯过程回归将可能的数据趋势曲线都保存下来(每条趋势曲线都有自己的置信度,在区间内呈高斯分布),最后在一张图中显示出来,再判断总体的趋势情况. b算法原理: ...
- airbnb机器学习模型_机器学习基础:预测Airbnb价格
airbnb机器学习模型 Machine learning is easily one of the biggest buzzwords in tech right now. Over the pas ...
- 献给杭电五十周年校庆的礼物+递推
献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 【阿旭机器学习实战】【13】决策树分类模型实战:泰坦尼克号生存预测
[阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文用机器学习中的决策树分类模型对泰坦尼克号生存项目进行预测. 关于决策树的详细介绍及原理参见前一 ...
- 随机信号处理AR模型Yule_Walker方程直接解法和Levinson_Durbin递推法的MATLAB与Python实现
AR模型 AR模型的系统函数H(z)可以表示为: 我们的目的就是要求解系统函数的参数a和增益G. Yule_Walker方程 矩阵形式 根据生成的矩阵,可以解出p个参数 ,再根据自相关函数,可以求出系 ...
- 数字化方法基础(三)_导入本地模型
数字化方法基础(三)_导入本地模型 Chapter 6 导入本地模型 如何创建一个列表 如何读取本地模型 全部教程链接: https://blog.csdn.net/weixin_44543463/a ...
- python建立回归模型_简单线性回归的Python建模方法
简单线性回归,就是两个随机变量存在一定大小的相关系数的前提下,结合散点图观察,采用最小二乘OLS方法,尝试建立一条回归直线,使得误差平方和SSE最小.OLS是一种参数方法,通过确定直线的斜率b和截距a ...
- java io 模型_五种 IO 模型
IO即为Input.Output,对计算机来说,我们使用键盘鼠标给计算机指令就是一种输入,计算机将我们键盘输入的文字显示到显示器即是一种输出.或者写博客时将计算机从键盘接收到的文字信息发送到平台上即为 ...
最新文章
- 通过Windbg查看DataTable的值
- ubuntu16安装中文版和windows关联
- 第一篇:Entity Framework 简介
- cout不明确什么意思_年轻人不讲武德是什么梗和意思 年轻人不讲武德梗出处
- android 设置超时时间,为android requestSingleUpdate设置超时
- Qt下实现多线程串口通信
- 中文命名实体识别,HMM,CRF,BiLSTM,BiLSTM+CRF的具体实现
- 如何用命令行运行python程序_如何使用运行python代码命令行.exe从C应用程序?
- day09面向对象+
- 通过数据,从键盘录入学生考试科目数,然后依次录入学的每一科分数.使用数组存储学生分数.然后输出总分,平均分,简单易理解
- Apache POI TXT转成EXCEL(XLSX)
- 4款FTP搜索引擎比专业
- 打开cad图纸计算机打不开,cad打不开_CAD图纸打开未响应怎么解决
- 【无人机航空摄影测量精品教程】目录:Pix4d、EPS、CC、PhotoScan、Godwork项目化作业流程及注意事项汇总
- cat6 万兆_千兆网线和万兆网线有什么区别?
- 安装bt5到u盘方法与步骤
- RFC5869翻译 HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
- html 按钮按下变色松开还原,js中怎么写点击按钮时变色,松开后恢复原来的颜色...
- Android 危险权限、权限组列表和所有普通权限
- php获取真实客户端IP方法
热门文章
- c 语言fabs函数的作用,c语言fabs是什么意思
- STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
- 如何显示密件抄送人员地址_什么是密件抄送,以及为什么不使用它会成为一个可怕的人...
- Encoder-decoder模型及Attention机制
- 【金融量化分析】#HW2 (Effective return;Duration and convexity;bootstrap method; minimum variance portfolios)
- shiro注册登录流程(如何加密加盐)+配置多个Ream+密码加密验证底层分析+Remember使用+不同密码比对器原理(二)
- 大三学生关于实习和考研的安排
- 狂神说的全部笔记_聪明人的方格笔记术
- 《东周列国志》第八十一回 美人计吴宫宠西施 言语科子贡说列国
- qcom 音频相关的dsp driver笔记(基于msm8996平台)