当前位置:首页 » 《关于电脑》 » 正文

R - 时间序列数据的预测——指数平滑法(一次、二次、三次)详解附代码与公式

9 人参与  2024年04月19日 08:11  分类 : 《关于电脑》  评论

点击全文阅读


指数平滑法简介


指数平滑法(Exponential Smoothing)是一种时间序列分析方法,用于处理时间序列数据的平滑和预测。

它的核心思想是基于过去的观测值来预测未来的值,同时对过去的数据赋予不同的权重,最近的观测值被赋予更大的权重,从而捕捉到时间序列的趋势和季节性模式。

指数平滑法的参数有3个——alpha、beta、gamma,分别对应数据、趋势、季节性。注意:参数值可以手动设定,参数值越大则模型越看重近期数据。若不设定参数,则软件会根据最大似然法计算得出参数值。

一次指数平滑法不考虑趋势与季节性,因此参数仅有alpha。

二次指数平滑法在一次的基础上进一步考虑了趋势,因此参数为alpha和beta。

三次指数平滑法在二次的基础上进一步考虑了季节性,因此参数为alpha、beta、gamma。此处需要注意的是季节性可以是加性(additive)或者乘性(multiplicative)的,这部分后续会详细解释。

一次指数平滑法(Simple Exponential Smoothing)

这是最简单的指数平滑方法,适用于没有趋势和季节性的时间序列。它使用单一平滑参数 alpha,将过去观测值的加权平均用于预测未来值。


模型公式

其中lt代表时间t时,数据的平滑值,yˆt+h为t+h时间的预测值。

即,一次指数平滑法的预测值始终等于t时刻的平滑值。

R代码实现

# 读取文件fc = read.table('AirPassengers.csv',sep=",",header=1)# 把数据转化为时间序列格式fc_ts = ts(fc$X,frequency=12,start=1949)# 导入forecast库library(forecast)# 拟合并预测未来20个样本点及其置信区间(默认为80% - 95%)pred = ses(fc_ts,h=20)# 绘制autoplot(pred)+autolayer(fitted(pred),series="Fitted")# 查看模型参数> pred$modelSimple exponential smoothing Call: ses(y = fc_ts, h = 20)   Smoothing parameters:    alpha = 0.9999   Initial states:    l = 111.9892   sigma:  33.8299     AIC     AICc      BIC 1733.787 1733.958 1742.696 

二次指数平滑法 —— 霍尔特线性指数平滑法(Holt's Exponential Smoothing)

适用于具有趋势但没有季节性的时间序列。它引入了两个平滑参数,alpha 和 beta,用于平滑观测值和趋势。


模型公式

其中lt代表时间t时,数据的平滑值,yˆt+h为t+h时间的预测值。

相比一次指数平滑法,这里进一步考虑了过往数据的趋势,并引入beta参数进行拟合。

第一个公式中,lt及bt均为常数,h代表预测的步数(h=1,2,3...),因此得出结论:二次指数平滑法的预测值为一元一次线性函数。

R代码实现

# 拟合并预测pred = holt(fc$X,h=20)# 绘制autoplot(pred)+autolayer(fitted(pred),series="Fitted")# 查看模型参数与结果> pred$modelHolt's method Call: holt(y = fc$X, h = 20)   Smoothing parameters:    alpha = 0.9999     beta  = 1e-04   Initial states:    l = 119.7517     b = 1.5963   sigma:  34.0125     AIC     AICc      BIC 1737.295 1737.729 1752.144 

三次指数平滑法——霍尔特-温特斯季节性指数平滑法(Holt-Winters Exponential Smoothing)

适用于具有趋势和季节性的时间序列。它引入了三个平滑参数,alpha、beta 和 gamma,用于平滑观测值、趋势和季节性成分。

模型所考虑的季节性因素可以为加性(additive),也可以为乘性(multiplicative)。这两者之间的主要区别是季节性对整个时间序列的影响方式不同。

加性季节性:这是一种模型,其中季节性效应被视为与时间序列的整体趋势和大小无关的部分。换句话说,季节性波动是一种在时间序列上的额外的、相对固定的波动。例如,如果你在夏季卖出的冰淇淋数量通常是每月总销售量的固定增量,那么你可能会使用加性季节性。

        举例:总销售 = 基本销售 + 季节性增量(夏季增加的销售)

乘性季节性:这是一种模型,其中季节性效应被视为与时间序列的整体趋势和大小相关的部分。季节性波动与总体趋势成比例变化。例如,如果总销售量逐渐增加,那么季节性波动也会相应增加。

        举例:总销售 = 基本销售 * 季节性比率(夏季销售与总销售的比率)

选择加性还是乘性季节性通常取决于你的数据和季节性模式的性质。如果季节性波动与总体趋势无关,那么加性季节性可能更适合。如果季节性波动与总体趋势相关,那么乘性季节性可能更适合。


模型公式 - 加性

st即季节性因素。

R代码实现 

# 拟合模型并预测pred = hw(ts(fc$X,frequency=12,start=1949),frequency=12,h=20,seasonal=c("additive"))# 绘制autoplot(pred)+autolayer(fitted(pred),series="Fitted")> pred$modelHolt-Winters' additive method Call: hw(y = ts(fc$X, frequency = 12, start = 1949), h = 20, frequency = 12)   Smoothing parameters:    alpha = 0.9935     beta  = 2e-04     gamma = 6e-04   Initial states:    l = 120.9608     b = 1.3934     s = -29.1816 -54.3842 -20.7169 15.0727 65.1554 66.1846           33.5822 -4.232 -8.0946 -3.8205 -34.3364 -25.2288  sigma:  18.0471     AIC     AICc      BIC 1565.872 1570.729 1616.359

模型公式 - 乘性

R代码实现 

# 拟合并预测(设定参数seasonal=c("multiplicative"))pred = hw(ts(fc$X,frequency=12,start=1949),frequency=12,h=20,seasonal=c("multiplicative"))# 绘制autoplot(pred)+autolayer(fitted(pred),series="Fitted")# 查看模型结果> pred$modelHolt-Winters' multiplicative method Call: hw(y = ts(fc$X, frequency = 12, start = 1949), h = 20, seasonal = c("multiplicative"),   Call:     frequency = 12)   Smoothing parameters:    alpha = 0.3146     beta  = 0.0071     gamma = 0.5977   Initial states:    l = 120.3796     b = 1.7757     s = 0.9298 0.7946 0.9024 1.0451 1.1338 1.1388           1.0529 0.9638 1.0349 1.0807 0.9854 0.9378  sigma:  0.0407     AIC     AICc      BIC 1405.654 1410.511 1456.141 

如何选择预测能力最准确的模型?

如何从上述4个模型中挑选出一个最适合当前数据的模型呢?

我们拟合模型的目的是预测时间序列数据,因此我们应该评估模型的预测能力。

一种可行的方法是:把一部分数据拿出来拟合模型,并得到一系列预测值,再把这些预测值与刚刚没有用于拟合模型的数据(真实值)做比较,测试其误差水平。这两个数据集也分别被称为训练集与验证集。

最后选择误差水平最低的一个模型即可。


选择训练集与验证集

# 选取训练集train = 1:120training = fc$X[train] # 选取训练集以外的作为交叉验证集test = fc$X[-train] 

误差水平——RMSE最小均方根

library(Metrics)# 检验ses模型ses_pred_test = ses(training,h=length(test))rmse_1 = rmse(test,ses_pred_test$mean)# 检验holt模型holt_pred_test = holt(training,h=length(test))rmse_2 = rmse(test,holt_pred_test$mean)# 检验hw模型 加法hw_add_pred_test = hw(ts(training,frequency=12),h=length(test),seasonal=c("additive"))rmse_3 = rmse(test,hw_add_pred_test$mean)# 检验hw模型 乘法hw_mul_pred_test = hw(ts(training,frequency=12),h=length(test),seasonal=c("multiplicative"))rmse_4 = rmse(test,hw_mul_pred_test$mean)RMSE = c(rmse_1,rmse_2,rmse_3,rmse_4)
print("模型与均方根误差:")data.frame(Methods,RMSE)[1] "模型与均方根误差:"  Methods      RMSE1     SES 137.331252    HOLT 117.112503  HW_ADD  91.223284  HW_MUL  37.18140

显然,乘性三次指数平滑法具有最小误差水平,表明其预测能力在4个模型中最佳。


点击全文阅读


本文链接:http://zhangshiyu.com/post/97375.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1