[FormulaExcelPython] 一次指数平滑、二次指数平滑、三次指数平滑(Holt-Winters)...
指数平滑由移动平均发展而来,和指数移动平均有点相似,也可认为是一种特殊的加权移动平均。按平滑的次数,指数平滑可分为一次指数平滑、二次指数平滑、三次指数平滑。移动平均除了简单预测外另在股市中作为支撑线发光发热;指数平滑主要用于预测,在各个领域应用非常广泛,是最常用的预测方法之一。
一次指数平滑:适用于序列没有趋势和季节性特征
二次指数平滑:适用于序列有趋势特征但无季节性特征
三次指数平滑:适用于序列有趋势特征且有季节性特征
一次指数平滑
简单指数平滑
一次指数平滑中最常用的实现方法就是简单指数平滑,有时我们说指数平滑也是指的简单指数平滑(Single Exponential Smoothing)。
参数:,平滑因子或平滑系数
预测方程:
平滑方程:
取值范围[0~1],值越大,越关注近期的观测值,远期的观测值影响越小。当时间序列相对平稳时,取较小的;当时间序列波动较大时,取较大的,以不忽略远期观测值的影响。
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holtdata = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]# 方法1,alpha=0.7
fit1 = SimpleExpSmoothing(data).fit(smoothing_level=0.7,optimized=False)
print('>> fit1', 'forecast:', fit1.forecast(3), 'sse:', fit1.sse)# 方法2,不加任何参数,optimized默认为True,能自动选择alpha。
fit2 = SimpleExpSmoothing(data).fit()
print('>> fit2', 'forecast:', fit2.forecast(3), 'sse:', fit2.sse)
推荐使用方法2,自动识别最优参数。statsmodels中通过最小化平滑值和实际值的欧式距离确定最优参数,其实也可通过SSE、MAE、RMSE、SMAPE等评估指标确定最优参数。不使用自动优化时,和可根据场景经验确定,简单指数平滑中statsmodels中默认使用第一个观测值作为初始指数平滑的值。
二次指数平滑
二次指数平滑,也叫双指数平滑,是指数平滑的扩展。常用实现为Holt指数平滑,方法中包含一个预测方程和两个平滑方程(水平平滑方程+趋势预测方程)。
其中,趋势部分又可分为加性趋势和乘性趋势,分别对应Holt线性趋势模型、指数趋势模型。
对于较大时间步长的预测,趋势可能不会无限延长,就需要抑制这种趋势,加性趋势和乘性趋势的抑制分别对应加性抑制(抑制线性趋势)、乘性抑制(抑制指数趋势)。
Holt线性趋势模型
Holt 在1957年把简单的指数平滑模型进行了延伸,能够预测包含趋势的数据,
参数1:,水平平滑因子,水平平滑参数
参数2:,趋势平滑因子,控制趋势变化的影响
预测方程:
水平方程:
趋势方程:
其中,代表时刻t的预估水平,代表时刻t的预测趋势,是水平的平滑参数,是趋势的平滑参数。
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = Holt(data).fit(smoothing_level=0.7, smoothing_trend=0.2, optimized=False)print(fit1.summary())
print('forecast:', fit1.forecast(3))
指数趋势模型
另外一种Holt 线性模型的变体是指数趋势模型,水平分量和趋势分量不再是相加的,而是相乘的。
参数1:,水平平滑因子
参数2:,趋势平滑因子
预测方程:
水平方程:
趋势方程:
其中,代表预估的增长率,描述指数趋势。
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = Holt(data, exponential=True).fit(smoothing_level=0.7, smoothing_trend=0.2, optimized=False)print(fit1.summary())
print('>> fit1', 'forecast:', fit1.forecast(3), 'sse:', fit1.sse)
阻尼趋势模型
Gardner 和 McKenzie (1985)引入了一种阻尼效应,未来的增长趋势会有所放缓。
参数1:,水平平滑因子
参数2:,趋势平滑因子
参数3:,0<<1,阻尼参数,防止预测“失控”
预测方程:
水平方程:
趋势方程:
其中,当时,等同于Holt线性趋势模型。
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = Holt(data, exponential=False, damped_trend=True).fit(smoothing_level=0.7, smoothing_trend=0.2, damping_trend=0.8, optimized=False)print(fit1.summary())
print('>> fit1', 'forecast:', fit1.forecast(3), 'sse:', fit1.sse)
乘法阻尼趋势
Taylor(2003)将阻尼参数拓展到乘法模型,预测结果不像加法阻尼那么保守。
参数1:,水平平滑因子
参数2:,趋势平滑因子
参数3:,0<<1,阻尼参数
预测方程:
水平方程:
趋势方程:
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = Holt(data, exponential=True, damped_trend=True).fit(smoothing_level=0.7, smoothing_trend=0.2, damping_trend=0.8, optimized=False)print(fit1.summary())
print('forecast:', fit1.forecast(3))
三次指数平滑
三次指数平滑是二次指数平滑基础上再做一次平滑,使用中通常使用Holt-Winters方法,我们平时讲三次指数平滑方法一般也是特指Holt-Winters指数平滑。
Holt (1957) 和 Winters (1960) 将Holt方法进行拓展,增加了对季节因素的处理。方法中包含一个预测方程和三个平滑方程 (一个用于水平,一个用于趋势,一个用于季节性分量)。
与趋势一样,季节性也有加性(线性)或乘性(指数)过程。当季节变化在时间序列中大致保持不变时,通常选择加法模型;而当季节变化与时间序列的水平成比例变化时,通常选择乘法模型。
Holt-Winters加法模型
用 来表示季节频率,如季度数据的m=4,月度数据的m=12。
参数1:,水平平滑参数
参数2:,趋势平滑参数
参数3:,季节性平滑参数,控制季节成分的影响
预测方程 :
水平方程 :
趋势方程 :
季节性方程:
其中,趋势方程与Holt线性方程相同。
将方程带入方程中,季节性方程也可表示为:
其中,
通常,
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='add').fit(smoothing_level=0.7, smoothing_trend=0.2, smoothing_seasonal=0.1, optimized=False)print(fit1.summary())
print('forecast:', fit1.forecast(3))
Holt-Winters乘法模型
参数1:,水平平滑参数
参数2:,趋势平滑参数
参数3:,季节性平滑参数,控制季节成分的影响
预测方程 :
水平方程 :
趋势方程 :
季节性方程:
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='mul').fit(smoothing_level=0.7, smoothing_trend=0.2, smoothing_seasonal=0.1, optimized=False)print(fit1.summary())
print('forecast:', fit1.forecast(3))
Holt-Winters的衰减法
加性和乘性Holt-Winters方法都可以进一步使用衰减法 。带有衰减趋势和乘性季节性的Holt-Winters方法通常可以为季节数据提供准确的和稳健的预测值。乘法模型增加阻尼参数的形式如下:
参数1:,水平平滑参数
参数2:,趋势平滑参数
参数3:,季节性平滑参数
参数4:,0<<1,阻尼参数
预测方程 :
水平方程 :
趋势方程 :
季节性方程:
示例演示
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]fit1 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='mul', damped_trend=True).fit(smoothing_level=0.7, smoothing_trend=0.2, smoothing_seasonal=0.1, optimized=True)print(fit1.summary())
print('forecast:', fit1.forecast(3))
写在最后
仍使用本次构造的简单数据,对比展示不同方法下的效果,可以看出Holt-Winters方法对当前周期性的数据拟合很好,但是需要指定周期大小,所以Holt-Winters一般适用于有明确周期性的数据。实践中一般不使用乘性趋势方法,通常效果较差。另外,statoolsmodels中fit训练时,支持对数据进行box-cox变换等处理,下面代码中不再作展示。
import numpy as np
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt# 数据
data = [1,2,3,4,5,2,3,4,5,6,3,4,5,6,7]# 训练
fit1 = SimpleExpSmoothing(data).fit()
fit2 = Holt(data).fit()
fit3 = Holt(data, exponential=True).fit()
fit4 = Holt(data, exponential=False, damped_trend=True).fit()
fit5 = Holt(data, exponential=True, damped_trend=True).fit()
fit6 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='add').fit()
fit7 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='mul').fit()
fit8 = ExponentialSmoothing(data, seasonal_periods=5, trend='mul', seasonal='add').fit()
fit9 = ExponentialSmoothing(data, seasonal_periods=5, trend='mul', seasonal='mul').fit()
fit10 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='add', damped_trend=True).fit()
fit11 = ExponentialSmoothing(data, seasonal_periods=5, trend='add', seasonal='mul', damped_trend=True).fit()
fit12 = ExponentialSmoothing(data, seasonal_periods=5, trend='mul', seasonal='add', damped_trend=True).fit()
fit13 = ExponentialSmoothing(data, seasonal_periods=5, trend='mul', seasonal='mul', damped_trend=True).fit()# 效果
FIT = [fit1, fit2, fit3, fit4, fit5, fit6, fit7, fit8, fit9, fit10, fit11, fit12, fit13]
SSE = [fit.sse for fit in FIT]
NAME = ['SES', 'Holt-ADD', 'Holt-MUL', 'Holt-ADD-DAM', 'Holt-MUL-DAM', 'HW-ADD-ADD', 'HW-ADD-MUL', 'HW-MUL-ADD', 'HW-MUL-MUL', 'HW-ADD-ADD-DAM', 'HW-ADD-MUL-DAM', 'HW-MUL-ADD-DAM', 'HW-MUL-MUL-DAM']# 对比
df = pd.DataFrame({'NAME': NAME, 'SSE': SSE})
df['RANK'] = df['SSE'].rank().astype(int)
print(df.head(13))# 画图
sel_index = np.argmin(SSE)
sel_model = FIT[int(sel_index)]
sel_model_name = NAME[int(sel_index)]l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(3)), marker='.')
l2, = plt.plot(list(sel_model.fittedvalues) + list(sel_model.forecast(3)), marker='*')
l3, = plt.plot(data, marker='.')plt.legend(handles = [l1, l2, l3], labels = ['data', 'SES', sel_model_name], loc='best', prop={'size': 7})
plt.show() #plot里label顺序错了
指数平滑各种版本的实现细节过于琐碎,可以后台回复关键字“ES”获取Excel示例下载地址,对于想要了解细节的朋友必会有所帮助。
参考链接
[1]https://www.statsmodels.org/v0.11.0/_modules/statsmodels/tsa/holtwinters.html
[2]https://otexts.com/fppcn/holt-winters.html
[3]https://wiki.mbalib.com/wiki/%E6%8C%87%E6%95%B0%E5%B9%B3%E6%BB%91%E6%B3%95
[4]https://www.cnblogs.com/houfei/p/13450880.html
[5]https://blog.csdn.net/fxlou/article/details/79678860
[6]https://www.cnblogs.com/21207-iHome/p/6673573.html
转自:TimeSeries 公众号;
END
版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。
合作请加QQ:365242293
数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。
[FormulaExcelPython] 一次指数平滑、二次指数平滑、三次指数平滑(Holt-Winters)...相关推荐
- 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息...
from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...
- java三次指数平滑_时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)
所有移动平均法都存在很多问题. 它们都太难计算了.每个点的计算都让你绞尽脑汁.而且也不能通过之前的计算结果推算出加权移动平均值. 移动平均值永远不可能应用于现有的数据集边缘的数据,因为它们的窗口宽度是 ...
- R语言(二)——简单线性模型中的指数变换
目录 一.数据 1.数据信息 2.数据处理 二.简单线性回归 三.指数变换 四.生存分析数据的Cox回归模型 一.数据 1.数据信息 口咽癌数据(pharynx.csv)是针对口咽若干位置癌细胞的临床 ...
- 时间序列预测方法的使用(简单、加权时序,简单加权移动,一次二次三次指数平滑法)
先简要介绍 1. 简单序时平均数法 也称算术平均法.即把若干历史时期的统计数值作为观察值,求出算术平均数作为下期预测值.这种方法基于下列假设:"过去这样,今后也将这样",把近期和远 ...
- 指数平滑方法(一次指数平滑、二次指数平滑、三次指数平滑):理论、代码、参数 介绍(全)
@创建于:20210324 @修改于:20210324 文章目录 特别说明 参考来源 包版本号 1.简介 2.一次指数平滑 2.1 理论介绍 2.2 代码展示 2.3 参数介绍 3. 二次指数平滑 3 ...
- 一文速学数模-时序预测模型(四)二次指数平滑法和三次指数平滑法详解+Python代码实现
目录 前言 二次指数平滑法(Holt's linear trend method) 1.定义 2.公式 二次指数平滑值: 二次指数平滑数学模型: 3.案例实现 三次指数平滑法(Holt-Winters ...
- 三次指数平滑法(Holt-Winters)
三次指数平滑法 https://blog.csdn.net/qq_32628233/article/details/51595479 参数选择 α,ß,γ的值都位于[0,1]之间,可以多试验几 ...
- 数学建模-三次指数平滑法(预测模型)
三次指数平滑预测法是在二次指数平滑值的基础上进行第三次指数平滑.同样,三次指数平滑值并不直接用来预测,而是为求解平滑系数.建立预测模型作准备. 三次指数平滑法几乎 ...
- 时间系列模型——三次指数平滑法
** 时间系列模型--三次指数平滑法 ** 时间序列预测技术是通过预测目标自身时间序列的处理,来研究其变化趋势,一个时间序列往往是以下几类变化形式的叠加与耦合.(1)长期趋势变动.(2)季节变动.(3 ...
最新文章
- 前端(jQuery)(5)-- jQuery AJAX异步访问和加载片段
- leetcode算法题--Russian Doll Envelopes
- windows下cmd命令提示符下让程序后台运行命令
- SpringAOP aspectJ ProceedingJoinPoint 获取当前方法
- 互联网公司的项目经理:客户伤不起
- 需要gmail的朋友请留下你们的email,还有86个
- Android开发笔记(十五)淡入淡出动画TransitionDrawable
- 如何搭建j2ee开发环境
- 单例模式懒汉Java_java 单例模式(懒汉式与饿汉式)
- Mac 系统下 配置多个ssh-key (git sourcetree)
- 重装系统不识别固态硬盘进入PE系统时候卡死
- 可信安全网络 —— 安全左移之DDoS对抗
- xtend 生成代码的编码问题
- 韩国李世龙19岁当爹 与洪瑛琦姐弟恋开花结果
- 20230105无剩余飞行时间的时间制导律:当导弹位于静止目标右侧时就打不中目标?
- 中国下一个十年的大趋势
- “三次握手,四次挥手”这么讲,保证你忘不了
- 中国矿业大学测绘工程专业课-学习笔记
- 选型帮推荐:上海音锋机器人【托盘四向车】
- 参数提取类毕业论文文献包含哪些?
热门文章
- matlab2014simulink中的三相晶闸管整流桥怎么找_哈尔滨有源滤波组件HPD2000-100-4L坏了怎么办 - 哈尔滨照明工业...
- 斯皮尔曼相关系数范围_Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现
- java bks证书_如何创建包含客户端证书链的BKS(BouncyCastle)格式的Java密钥库
- 天津市高中计算机会考,天津高中会考科目有哪些
- Java ThreadLocalRandom 伪随机数生成器的源码深度解析与应用
- 程序员无处安放的青春
- 安徽阜阳计算机高中学校排名,安徽最强的五所高中,都是知名实力中学,考上就离名牌大学不远了!...
- Git远程库代码回退
- ios工程-如何添加mixpanel来实现统计用户的点击量、玩游戏时长
- 验证账号的服务器失败是怎么回事,服务器安全验证失败怎么回事