-
2021-01-12 18:45:29
满意答案
love430023
2020.11.15
采纳率:43% 等级:9
已帮助:319人
我们在使用SPSS做数据分析的时候,有时需要利用SPSS做时间序列分析,那么时间序列分析应该注意什么和具体该如何去操作呢?
开启分步阅读模式
工具材料:
SPSS
ARIMA模型
指数平滑法
操作方法
01
首先,我们在SPSS里面导入Excel里面的一组测试数据用来做时间序列分析。在如图所示的对话框中“打开现有数据源”下面选择图示的excel文件。
02
然后在弹出的“打开Excel数据源”框内,“工作表”下面选择你输入数据的Excel sheet表格,单击“确定”。
03
接着,我们需要查看我们导入的数据,比如是否有缺失数据,数据的分布是怎么样的。方法一:点击左下角“数据视图”,查看原数据(使用数据不多的情况);方法二:依次点击“分析-描述统计-描述“查看数据情况(数据多的情况下推荐)。
数据预处理
01
在完成上面的步骤后,做时间序列分析前需要对数据进行一个预处理,即为数据定义日期。
02
首先,我们在如图所示的菜单上依次点击“数据--定义日期”。
03
接着,我们在弹出的“定义日期”对话框内,设置日期的格式。在图示的案例中,我们现在“年份,月”作为日期格式。
04
确定日期格式后,我们在SPSS数据表格里面的“数据视图”可以看到新插入的日期“Year”“Month”“Date”(新变量默认名称)。
时间序列分析-指数平滑法
01
首先,我们利用指数平滑法时间序列分析。指数平滑法的使用特点是将较大的权数放在最近的资料。
02
我们依次点击第一排菜单栏里面的“分析-预测-创建模型”,弹出“时间序列建模器”。
03
现在进行一些设置:在“变量”选项下,将需要进行时间序列预测的变量拖入图示的“因变量”框内;在方法中,选择“指数平滑法”。
04
其他的一些设置包括【统计量】,我们勾选“平稳的R方”“拟合优度”“显示预测值”;在【图表】中选“观察值”“预测值”“拟合值”;在【保存】中勾选“预测值”;在【选项】下填写我们需要预测到的指定日期。
05
全部设置完成后,点击【确定】,即可在输出文档里面看到时间序列建模程序显示的结果(右击结果图表可以复制,导出到Excel等操作)。
时间序列分析-ARIMA模型
01
我们还可以使用ARIMA模型来进行时间序列的预测,使用的特点是将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。ARIMA模型中ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数。
02
使用的方法和上面的类似,依次点击第一排菜单栏里面的“分析-预测-创建模型”,弹出“时间序列建模器”。
03
由于在指数平滑法中我们做了设置,这里就不需要再次设置。这里需要的设置是把【变量】下面的自变量拖入【因变量】框内和【自变量】框内,然后在方法中选择“ARIMA”即可。
04
全部设置完成后,单击确定,即可在刚才的输出文档里面看到使用ARIMA模型的预测结果(同样,这些结果右击可以进行复制导出等操作)。
特别提示
注意指数平滑法中不能包含自变量。
保存下的变量名前缀由于SPSS的BUG需要做更改。
数据量非常大的话可以使用SPSS工具不适合。
00分享举报
更多相关内容 -
MATLAB_三次指数平滑法_matlab_指数平滑预测_二次指数平滑_
2021-09-30 03:47:17matlab中可用于预测的三次指数平滑法,针对有二次趋势的数据 -
python构建指数平滑预测模型示例
2021-01-03 01:03:57指数平滑法按照平滑的次数,一般可分为一次指数平滑法、二次指数平滑法和三次指数平滑法等。然而一次指数平滑法适用于无趋势效应、呈平滑趋势的时间序列的预测和分析,二次指数平滑法多适用于呈线性变化的时间序列... -
基于平滑指数的社会商品零售额预测.docx
2021-09-09 18:04:17随着社会不断地进步和发展,消费是关系整个社会经济协调发展的重要问题,消费的增长是产生新...本文以我国1981年至2015年我国社会消费品零售总额为研究对象,通过三次指数平滑模型进行对2016至2018年零售总额进行预测。 -
一次二次三次指数平滑案例详解.xlsx
2020-04-21 20:14:40该文档为原创文档,内容是一次二次三次指数平滑方法的3份数据和对应的操作,对我们深刻理解指数平滑有很大帮助哦。 -
指数平滑-Python代码-信息分析与预测
2020-05-23 16:09:37信息分析与预测的实验,Python写的代码,萌新代码,勿喷,仅仅只是方便没时间写实验的朋友,直接用python打开就能运行 -
java 实现指数平滑 包含(1-3次)
2018-05-08 17:25:53指数平滑用来做时间序列预测,数据是单个时间序列,输入数据格式为二维数据, 一维数据,只需定义一个一行多列的数组即可 -
指数平滑预测
2018-08-06 17:18:04指数平滑算法,包括一次指数,二次指数,三次指数,且有注释说明怎么使用 -
一次,二次,三次指数平滑预测算法java
2018-12-29 18:07:24java代码实现指数平滑算法,其中包括一次,二次,三次 -
指数平滑预测_指数平滑预测_
2021-10-01 11:40:23一次/三次指数平滑预测算法,输入向量输出原图像,预测图像 -
指数平滑法在贵州省煤炭产量预测中的应用初探
2020-07-05 02:01:19利用EXCEL软件中的指数平滑分析工具对贵州省2000年至2010年11年的煤炭产量数据进行分析,分别测算几个不同平滑指数下的一次指数平滑结果,根据偏差平方最优原理选择合适的平滑指数,再通过二次指数平滑,得出贵州省煤炭... -
指数平滑.xls
2021-09-18 19:50:49指数平滑.xls -
Matlab三次指数平滑算法
2017-09-06 18:07:44Matlab实现三次指数平滑算法Matlab实现三次指数平滑算法Matlab实现三次指数平滑算法Matlab实现三次指数平滑算法Matlab实现三次指数平滑算法 -
指数平滑算法
2018-02-08 09:17:36指数平滑算法 -
布朗单一参数指数平滑法的推广* (2006年)
2021-05-07 04:55:51把布朗单一参数二次多项式指数平滑法推广到三次多项式指数平滑法(即布朗单一参数四次指数平滑法),并利用计量经济学软件Eviews410和软件Matlab710结合实际数据进行短期预测。布朗单一参数四次指数平滑能更好地跟踪... -
指数平滑器:时间序列的指数平滑。-matlab开发
2021-06-01 12:07:08给定输入序列 X(列向量),以 FS 赫兹采样,返回指数平滑的输出序列 Y。指数平滑器的时间常数(以毫秒为单位)在 TAU 中指定。 如果 X 是矩阵,则对 X 的列向量进行平滑处理并作为 Y 的列向量返回。 如需进一步的... -
expsmoother:使用单,双和三重指数平滑方法的预测软件
2021-05-20 11:15:02专家 使用单,双和三重指数平滑方法的预测软件 -
三次指数平滑法的预测
2019-03-05 01:27:53Excel完整文档,三次指数平滑法的预测完整程序 博文链接:https://hot112.iteye.com/blog/199641 -
指数平滑(部分)
2021-09-06 16:53:36指数平滑 一、简单平滑 1、简单平滑 最简单的指数平滑方法自然被称为“简单指数平滑”(SES)12。这种方法适用于预测没有明显趋势或季节因素的数据。 例如,图 中的数据没有显示出任何明确的趋势或季节性因素。 使用...指数平滑
一、简单平滑
1、简单平滑
最简单的指数平滑方法自然被称为“简单指数平滑”(SES)12。这种方法适用于预测没有明显趋势或季节因素的数据。
例如,图 中的数据没有显示出任何明确的趋势或季节性因素。
使用朴素预测法,对未来的所有预测都等于该序列的最后一个观测值,
其中 h = 1,2,…因此,朴素预测法假设最近的观测值是唯一重要的观测值,并且之前所有的观测值都不提供未来的信息。这可以看作是一个加权平均值,其中所有的权重都被赋给了最后一次观测值。
使用平均预测法,所有未来预测值都等于观测数据的简单平均值,
平均预测法假设所有观测值具有同等重要性,并在预测时给予相同的权重。
我们经常需要的是在这两个极端方法之间的方法。例如,将更大的权重赋到最近的观测值而不是过去的观测值可能是明智的。这正是简单指数平滑背后的原理。预测值使用加权平均值进行计算,其中权重随观测时间的久远程度呈指数型下降 — 最早的观察值被赋予最小的权值:
是平滑参数。向前一步
时刻的预测值是时间系列
中所有观察值的加权平均值。权重下降的速度由参数
控制。
2、加权平均形式
T+ 1时刻的预测值等于最近的观测值Yt和之前的预测值Yt|t+1之间的加权平均值
3、分量形式
指数平滑法的分量形式表示包括一个预测方程和该方法中包含的每个分量部分的平滑方程。 简单指数平滑的分量形式由下式给
出:(趋势bt,季节性分量st)lt是时间序列t的级别(或者平滑值)
4、优化
每个指数平滑方法在应用时都需要选择平滑参数和初始值。特别是对于简单的指数平滑,我们需要选择
α 和 ℓ0的值。只要我们知道这些值,所有的预测值都可以从数据中计算出来。对于后文提到的方法,通常有多个平滑参数和多个初始分量要选择。在某些情况下,平滑参数可以进行主观选择—预测者根据以前的经验设定平滑参数的值。然而,一种更可靠和客观的获得未知参数值的方法是从观测数据中估计它们。通过最小化残差平方和(通常称为SSE或“误差平方和”)来估计回归模型的系数 。类似地,任何指数平滑方法的未知参数和初始值也可以通过最小化SSE来进行估计。对于t = 1,… T,设定残差为与回归情况(通过公式来返回最小化SSE的回归系数值)不同,指数平滑法涉及到一个非线性的最小化问题,因此我们需要使用优化工具来解决。
二、趋势法
2.1霍尔特的线性趋势法
Holt (1957) 将简单指数平滑法扩展到可以预测具有趋势的数据。该方法包含一个预测方程和两个平滑方程(一个用于水平,一个用于趋势):
其中
ℓt表示在 t时刻该时间序列的水平的估计值, bt表示该时间序列在 t时刻的趋势(斜率)的估计, α是水平 0≤α≤1 的平滑参数, β∗是趋势 0≤β∗≤1 的平滑参数。2.2阻尼趋势方法
Holt线性方法产生的预测值可以显示出未来的趋势(增加或减少)。经验表明,这些方法通常会产生过度预测,尤其是对于更长远的预测而言。受此启发,Gardner & McKenzie (1985) 引入了一个参数,可以在未来某些时刻“平缓”趋势。包含平缓趋势的方法已被证明是十分成功的,并且可以说是当许多时间系列需要自动预测时最受欢迎的方法。
如果 ϕ=1 ,则该方法与Holt线性方法相同。对于 0 和 1 之间的取值, ϕ 平缓了趋势,使其在将来某个时间接近一个常数。事实上,对于任意 0<ϕ<1 ,随着 h→∞ ,预测值收敛到 ℓT+ϕbT/(1−ϕ) 。这意味着短期预测值有一定的趋势,而长期预测值则保持不变。
实际上, ϕ 很少小于0.8,因为阻尼对于较小的值具有非常强的影响。 ϕ 的值接近1意味着包含阻尼系数的模型无法与不包含阻尼系数的模型区分开来。由于这些原因,我们通常限定 ϕ 的最小值为0.8,最大值为0.98…
未完… -
基于线性二次指数平滑法的瓦斯含量预测
2020-05-29 14:09:22为了提高煤层瓦斯含量的预测精度,以某矿区垂深间隔为50 m的瓦斯含量数据,瓦斯含量运用线性二次指数平滑法建立瓦斯含量预测模型,并结合折线图和方差分析比较预测结果与实测数据。结果表明:平滑常数α为0.8的线性二次... -
二次指数平滑
2015-11-21 21:30:43二次指数平滑算法的仿真实现,可对平稳时间序列进行预测 -
一般指数平滑:这个程序用于寻找指数平滑-matlab开发
2021-05-30 19:51:43这个程序用来寻找指数平滑 -
EXCEL移动平均和指数平滑
2014-06-28 10:04:56EXCEL移动平均和指数平滑详细描述了excel移动平均法和指数平滑法的操作过程,对于学习非常有帮助。 -
论文研究-平滑系数自适应的二次指数平滑模型及其应用.pdf
2019-09-20 11:01:41论文研究-平滑系数自适应的二次指数平滑模型及其应用.pdf, 通过对传统指数平滑模型的分析,提出了动态平滑参数的概念;并由此建立了平滑权重对时间序列能够自适应的新的二... -
一次指数平滑
2018-04-09 10:03:58用于比较不同权重系数的一次指数平滑优劣的通用程序。待分析的时间序列可根据喜好选择通过input命令在命令窗口输入,或直接在程序中给出。 -
指数平滑法之收入预测
2020-10-28 14:57:23时间序列平滑法包括:简单平均法、移动平均法(简单移动平均法和加权移动平均法)、一次指数平滑法(Single Exponential Smoothing)、布朗(Brown)单一参数线性指数平滑法、霍特(Holt)双参数指数平滑法、布朗三...时间序列平滑法包括:简单平均法、移动平均法(简单移动平均法和加权移动平均法)、一次指数平滑法(Single Exponential Smoothing)、布朗(Brown)单一参数线性指数平滑法、霍特(Holt)双参数指数平滑法、布朗三次指数平滑法、温特(Winter)线性和季节性指数平滑法等。下面介绍一次指数平滑法、布朗(Brown)单一参数线性指数平滑法(二次指数)和布朗三次指数平滑法、霍特双参数指数平滑法 。
1、指数平滑的定义及公式
(1)产生背景:指数平滑由布朗提出:时间序列的态势具有稳定性或规则性,所以时间序列可被合理地顺势推延;最近的过去态势,在某种程度上会持续的未来,所以将较大的权数放在最近的资料。
(2)基本原理:指数平滑法是移动平均法中的一种,其特点在于给过去的观测值不一样的权重,即较近期观测值的权数比较远期观测值的权数要大。根据平滑次数不同,指数平滑法分为一次指数平滑法、二次指数平滑法和三次指数平滑法等。但它们的基本思想都是:预测值是以前观测值的加权和,且对不同的数据给予不同的权数,新数据给予较大的权数,旧数据给予较小的权数。
(3) 方法应用:指数平滑法是生产预测中常用的一种方法。也用于中短期经济发展趋势预测,所有预测方法中,指数平滑是用得最多的一种。
指数平滑法的基本公式:St=a*yt+(1-a)St-1 式中,
St–时间t的平滑值;
yt–时间t的实际值;
St-1–时间t-1的平滑值;
a–平滑常数,其取值范围为[0,1]
据平滑次数不同,指数平滑法分为:一次指数平滑法、二次指数平滑和三次指数平滑法等。
2、α平滑常数的确定
指数平滑法中最重要的一个参数是平滑常数α,α的取值范围是[0-1],α值是主观选定的,值越大表示对未来的预测中越近期的数据权重越大。在市场预测中,α的确定方法,一般是先根据经验做一个大概的预估,基本判断标准如下:
1.时间序列比较平稳时,选择较小的α值,0.05-0.20。
2.时间序列有波动,但长期趋势没大的变化,可选稍大的α值,0.10-0.40。
3.时间序列波动很大,长期趋势变化大有明显的上升或下降趋势时,宜选较大的α值,0.60-0.80。
4.当时间序列是上升或下降序列,满足加性模型,α取较大值,0.60-1。
再重复试算过程,比较不同α值下,预测的标准误差,从而选取误差较小的α值来建立模型。
其中,MSE为均方误差,MAPE为平均绝对百分误差
3、一次指数平滑
当时间数列无明显的趋势变化,可用一次指数平滑预测。其预测公式为:
yt+1’=ayt+(1-a)*yt’ 式中,
• yt+1’–t+1期的预测值,即本期(t期)的平滑值St ;
• yt–t期的实际值;
• yt’–t期的预测值,即上期的平滑值St-1 。一次指数平滑的公式跟指数平滑基本公式类似,但t+1期的预测值是t期观测值和t期预测值的加权平均值,由于观测值的获取,所以从公式来看,一次指数平滑只能预测下一期的值。
与移动平均类似,一次指数平滑法得到的平滑值与观测值相比,存在滞后性。4、二次指数平滑
一次指数平滑直接利用平滑值作为预测值,二次指数平滑法则是利用平滑值对趋势进行修正后得到的线性平滑模型。
初始平滑值需要估计,这种估计是在所有的指数平滑法中都要进行的。但这一估计数据仅对初始阶段的相关计算有一定影响,随着预测期数的增加,其影响愈来愈小,直至彻底消除。一般情况下,取时间序列第一期的观察值,或者前几期观察值的算术平均值。
5、三次指数平滑
三次指数平滑法,与二次指数平滑法一样,对时间序列的非线性趋势进行修正。是在前两次指数平滑的基础上,使用两次平滑值再进行一次平滑,得到其关于时间的非线性发展趋势模型
式中对应参数含义与二次指数平滑中相同,三次指数平滑法也需要估计初始平滑值,一般也选择时间序列第一期的观察值,或者为前几期观察值的算术平均值。
6、霍特双参数指数平滑法
霍特双参数指数平滑法与布朗单一参数线性指数平滑法的原理相似,但它不直接应用二次指数平滑,而是分别对时间序列数据和趋势进行平滑。它使用两个平滑常数α和γ(数值均在0与1之间)和三个计算公式。三个计算公式分别为:
St为时间序列第t期的平滑值,bt为时间序列第t期趋势的平滑值,m为预测的超前期数,Ft+m为时间序列第t+m期的预测值。
应用霍特双参数指数平滑法的关键在于选择一对合适的平滑常数α和γ。一般根据时间序列的特点和预测经验,先预选几对α和γ,然后根据预测误差的对比分析,选择预测误差最小的α和γ的组合。S1通常取时间序列第一期的观察值或前几期观察值的算术平均值、b1通常不使用公式进行计算,而是取时间序列前两期观察值之差或前几期观察值两两之差的算术平均值。S1和b1的选择对预测值的影响与布朗单一参数线性指数平滑法相同。7、收入预测应用
(1)布朗指数平滑法:
实际预测时,一般根据时间序列特点和预测经验,先预选几个α,然后根据预测误差的对比分析,选择预测误差最小的α,本案例测试时发现α取0.1时误差最小。
利用上图最后一个月的系数预测20年人均收入,其中2月只有29天,比正常月份少1天或2天,所以2月的收入需要进行修正,修正的方法是:2月的人均收入=1月预测值-1月预测值/31*1,得到下图结果
计算预测误差,MSE=1.7,MAPE=3.2%,从预测误差的计算结果看,平均绝对百分误差小于5%,预测精度较高。
(2)霍特双参数指数平滑法应用
其中α=0.4,γ=0.7,S1=Y1=36.4,b1=Y2-Y1=-2.1,最后利用最后一期的系数预测20年底收入。
计算预测误差,MSE=0.4,MAPE=1.2%,从预测误差的计算结果看,预测精度较高,比三次指数平滑法的预测结果更高。
8、应用excel实现平滑指数
除了用公式计算出来平滑指数之外,excel也提供了实现的方法,具体步骤如下:
选择工具菜单中的数据—数据分析命令,此时弹出数据分析对话框。
在分析工具列表框中,选择指数平滑工具。
其中阻尼系数=1-α,实例的α取的是0.13 。
重复三次,选择对应的输入区域,一次平滑指数,输入区域选择原始数据,二次平滑指数选择一次平滑指数的值作为输入区域,三次平滑指数选择二次平滑指数作为输入区域,点确定就可以得到下图的数据
9、总结(1)时间序列无季节性特征且产品产量变动具有线性趋势,应采用二次指数平滑法或霍特双参数指数平滑法;
(2)如果时间序列无季节性特征但产品产量变动具有非线性趋势,应采用布朗三次指数平滑法;
(3)如果时间序列具有季节性而产品产量变动具有线性趋势,则应采用温特线性和季节性指数平滑法。
这四种方法中,仅布朗三次指数平滑法属于非线性平滑法,它具有预测曲线拐点的优势。在实际应用中,使用时间序列平滑法的前提条件是:
(1)所预测的客观事物发展属于渐进式,无跳跃性的变化;
(2)过去和目前影响客观事物发展的因素也决定着客观事物未来的发展。
由于客观事物的发展变动受多种因素的影响,而各种影响因素又可能是不断发展或不断变动的,因此,时间序列平滑法在一般情况下仅适用于短期的与近期的预测。当预测如果需要延伸至较远未来,时间序列平滑法则存在较大的局限性。时间序列平滑法在客观影响因素发生较大变化可能产生较大的预测误差。为降低这些可能的预测误差,必须充分研究客观影响因素可能的发展与变动,将定性分析和定量研究结合起来,这样才能提高预测的精度。
参考文章:https://cloud.tencent.com/developer/article/1058557;
https://blog.csdn.net/nieson2012/article/details/51980943关注以下公众号可以更方便查看文章哦(* ̄︶ ̄)
-
指数平滑法
2021-03-13 23:07:35二次指数平滑 我们对一次指数平滑值再进行指数平滑,可以获得趋势。二次指数平滑法的预测模型为: 式中: 分别为时间t和时间t - 1的二次指数平滑值。 三次指数平滑 二次指数模型是线性的,对于非线性趋势预测我们...时间序列分解
大量时间序列的观测样本表现出趋势性、季节性和随机性,或者三者中的其一或其二。于是,我们认为每个时间序列,都可以分为三个部分的叠加
其中,T是趋势项,S是季节项,R是随机项。
上述公式表现了趋势项和季节项是累加的,实际应用场景中,趋势项和季节项可能是累乘的,时间序列可以分解为如下公式
实际应用中,随机项R的期望为0,没有规律,并且绝对值不大。所以在应用场景中我们往往省略掉R,R称作噪声。预测公式如下
或
一次指数平滑法
线性回归算法中,每个经验点的权重是一致的,即很早以前的经验数据也可能对预测数据有较大的影响。很多实际场景中,未来一段时间的趋势可能和在最近一段时间的趋势关系更加紧密。比如小明去年数学考试成绩一直不及格,今年连续多次考试90多分,预测小明下一次数学考试的成绩,情理上90多分的可能性更高。采用传统的线性回归算法,预测结果可能是70多分。
指数平滑法认为越老的经验数据对趋势的影响越小。我们假定时间t的观测值为y(t),时间t的预测值为S(t),则时间t+1的预测值S(t+1)为
a的取值范围(0, 1),a越大,最近时间点的观测值对预测值的影响越大。
假设我们有t个经验数据,根据上述一次指数平滑公式,预测值S(t + n) = S(t + 1),预测值不具备趋势。
二次指数平滑
我们对一次指数平滑值再进行指数平滑,可以获得趋势。二次指数平滑法的预测模型为:
式中:
分别为时间t和时间t - 1的二次指数平滑值。
三次指数平滑
二次指数模型是线性的,对于非线性趋势预测我们可以使用三次指数平滑法。公式如下
Holt-Winters算法
对于具有周期性的趋势预测,我们可以使用Holt-Winters算法。累乘性Holt-Winters公式如下
其中,alpha,beta,gamma取值范围为(0, 1),分别表示全局因子,趋势因子,周期性因子中最近时间点数据对预测数据的影响程度。y为经验数据,L为周期。
表示使用t时间点的估计值预测t+m时间点的值。
注:预测公式中I(t – L + m)应该为I(t – L + 1 +(m – 1) mod L)
计算步骤
alpha,beta,gamma,y,L,m已知。
(1)初始化S0
S0 = y0
(2)初始化b0
(3)初始化I1, I2, …, IL
(3)计算所有S,b,I
(4)根据公式预测未来值。其中,t取经验数据最后一个时间点,t+m为预测时间点。
累加性Holt-Winters公式
Holt-Winters理解
指数平滑法与Holt-Winters不是建立在理论基础上的,而是一种经验法则。文章开发我们讨论了时间序列的分解,Holt-Winters公式正是把时间序列分解为趋势项和周期项。其中趋势项为线性函数s + mb,周期项为c。这里面趋势项与周期项考虑了指数平滑,即给不同时间点的趋势或者周期性赋予了不同的权重。不过,这里的趋势仅仅是线性趋势,在带有季节性的非线性趋势预测中,效果可能不那么好。
Holt-Winters的Java实现
下面的代码实在google上搜索的,预测公式逻辑有问题,没有对季节项进行mod运算,会导致数组越界,有空再修改代码。
packagecoshaho.learn;public classHoltWinters
{public static double[] forecast(int[] y, double alpha, doublebeta,double gamma, int period, int m, booleandebug) {if (y == null) {return null;
}int seasons = y.length /period;double a0 =calculateInitialLevel(y, period);double b0 =calculateInitialTrend(y, period);double[] initialSeasonalIndices =calculateSeasonalIndices(y, period, seasons);if(debug) {
System.out.println(String.format("Total observations: %d, Seasons %d, Periods %d", y.length,
seasons, period));
System.out.println("Initial level value a0: " +a0);
System.out.println("Initial trend value b0: " +b0);
printArray("Seasonal Indices: ", initialSeasonalIndices);
}double[] forecast =calculateHoltWinters(y, a0, b0, alpha, beta, gamma,
initialSeasonalIndices, period, m, debug);if(debug) {
printArray("Forecast", forecast);
}returnforecast;
}private static double[] calculateHoltWinters(int[] y, double a0, double b0, doublealpha,double beta, double gamma, double[] initialSeasonalIndices, int period, int m, booleandebug) {double[] St = new double[y.length];double[] Bt = new double[y.length];double[] It = new double[y.length];double[] Ft = new double[y.length +m];//Initialize base values
St[1] =a0;
Bt[1] =b0;for (int i = 0; i < period; i++) {
It[i]=initialSeasonalIndices[i];
}
Ft[m]= (St[0] + (m * Bt[0])) * It[0];//This is actually 0 since Bt[0] = 0
Ft[m + 1] = (St[1] + (m * Bt[1])) * It[1];//Forecast starts from period + 2//Start calculations
for (int i = 2; i < y.length; i++) {//Calculate overall smoothing
if((i - period) >= 0) {
St[i]= alpha * y[i] / It[i - period] + (1.0 - alpha) * (St[i - 1] + Bt[i - 1]);
}else{
St[i]= alpha * y[i] + (1.0 - alpha) * (St[i - 1] + Bt[i - 1]);
}//Calculate trend smoothing
Bt[i] = gamma * (St[i] - St[i - 1]) + (1 - gamma) * Bt[i - 1];//Calculate seasonal smoothing
if((i - period) >= 0) {
It[i]= beta * y[i] / St[i] + (1.0 - beta) * It[i -period];
}//Calculate forecast
if( ((i + m) >=period) ){
Ft[i+ m] = (St[i] + (m * Bt[i])) * It[i - period +m];
}if(debug){
System.out.println(String.format("i = %d, y = %d, S = %f, Bt = %f, It = %f, F = %f", i,
y[i], St[i], Bt[i], It[i], Ft[i]));
}
}returnFt;
}/*** See:http://robjhyndman.com/researchtips/hw-initialization/* 1st period's average can be taken. But y[0] works better.
*
*@return- Initial Level value i.e. St[1]*/
private static double calculateInitialLevel(int[] y, intperiod) {/**double sum = 0;
for (int i = 0; i < period; i++) {
sum += y[i];
}
return sum / period;
**/
return y[0];
}/*** See:http://www.itl.nist.gov/div898/handbook/pmc/section4/pmc435.htm*
*@return- Initial trend - Bt[1]*/
private static double calculateInitialTrend(int[] y, intperiod){double sum = 0;for (int i = 0; i < period; i++) {
sum+= (y[period + i] -y[i]);
}return sum / (period *period);
}/*** See:http://www.itl.nist.gov/div898/handbook/pmc/section4/pmc435.htm*
*@return- Seasonal Indices.*/
private static double[] calculateSeasonalIndices(int[] y, int period, intseasons){double[] seasonalAverage = new double[seasons];double[] seasonalIndices = new double[period];double[] averagedObservations = new double[y.length];for (int i = 0; i < seasons; i++) {for (int j = 0; j < period; j++) {
seasonalAverage[i]+= y[(i * period) +j];
}
seasonalAverage[i]/=period;
}for (int i = 0; i < seasons; i++) {for (int j = 0; j < period; j++) {
averagedObservations[(i* period) + j] = y[(i * period) + j] /seasonalAverage[i];
}
}for (int i = 0; i < period; i++) {for (int j = 0; j < seasons; j++) {
seasonalIndices[i]+= averagedObservations[(j * period) +i];
}
seasonalIndices[i]/=seasons;
}returnseasonalIndices;
}private static void printArray(String description, double[] data){
System.out.println(String.format("******************* %s *********************", description));for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
System.out.println(String.format("*****************************************************************", description));
}
}
-
基于自适应单指数平滑法的矿井防尘用水量预测
2020-07-10 19:28:44煤矿井下防尘用水量是矿井防尘供水...为实现矿井防尘用水量的准确预测,建立了自动调整平滑参数的单指数平滑法预测模型,并以开滦集团钱家营煤矿防尘用水量实测数据为例,验证了应用模型进行矿井防尘用水量预测的有效性。 -
二次指数平滑法
2014-05-06 17:09:11function ESM2=funesm2(x,L0,L1,L2,m,alpha) T=input('T='); S1=zeros(round((L2-L0)/L1),length(x)); S2=zeros(round((L2-L0)/L1),length(x)); a2=zeros(round((L2-L0)/L1),length(x));