一文速学-时间序列分析算法之指数平滑法详解+Python代码实现

简介: 一文速学-时间序列分析算法之指数平滑法详解+Python代码实现

前言


前两篇文章已经将时间序列分析算法的移动平均法系列讲的很详细清晰了:


一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现


一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码


相信大家看完都有一定的计算基础以及理解时序预测算法要做的事情,计算原理无非就是根据时间滑窗来预测计算出下一个时间段数据,就是采取的运算策略和运用场景不同,需要选择相应的算法去支撑。指数平滑法总共有三种形式:

089dde9da9734fd4bbcfb75eccf68bf1.png

指数平滑法实际上是一种特殊的加权移动平均法,之前我们在code加权移动平均法就发现仅凭自己设定权重是一件比较不可靠的事,如果遇到变化并不平缓明显的数据时并不能很好的计算出结果。倘若权重能够根据实际情况自我训练调整,那么加权移动平均法就更加有作用。下面就我们来了解指数平滑法是如何做到权重变化的吧。


一、指数平滑法


1.简介


指数平滑法是生产预测中常用的一种方法。也用于中短期经济发展趋势预测,所有预测方法中,指数平滑是用得最多的一种。简单的全期平均法是对时间数列的过去数据一个不漏地全部加以同等利用;移动平均法则不考虑较远期的数据,并在加权移动平均法中给予近期资料更大的权重;而指数平滑法则兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数。


0b28eaf883af4ad1a0eb6fa051d0b624.png


那么我们以一种通俗易懂的方式来说明:假如我们现在在驾校练车,第一秒的速度为5km/h,第二秒的速度为8km/h,第三秒的速度为10km/h,那么随着时间推进,对于下一个秒数来说,肯定上一秒的数据影响力更大一些。那么我们再来看看接下来的时间段内,数十秒之后,倘若上一时刻的速度的权重为0.9,那么下一时刻经过完了,该权重则需要进行下调。假设随着时间变化权重以指数的方式下降,最近为0.9,那么下一个预测时间段就为,下下一个预测时间段为,以此类推...。将权重按照指数级进行衰减,这就是指数平滑法的基本思想。


指数平滑法有几种不同形式:一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但没有季节性的序列,三次指数平滑法针对有趋势也有季节性的序列。“Holt-Winters”有时特指三次指数平滑法。


2.特点


第一,指数平滑法进一步加强了观察期近期观察值对预测值的作用,对不同时间的观察值所赋予的权数不等,从而加大了近期观察值的权数,使预测值能够迅速反映实际的变化。


第二,指数平滑法对于观察值所赋予的权数有伸缩性,可以取不同的权值以改变权数的变化速率。如权值取小值,则权数变化较迅速,观察值的新近变化趋势较能迅速反映于指数移动平均值中。因此,运用指数平滑法,可以选择不同的权值来调节时间序列观察值的均匀程度(即趋势变化的平稳程度)。


3.基本原理


也就是说指数平滑法是在移动平均法基础上发展起来的一种时间序列分析预测法,它是通过计算指数平滑值,配合一定的时间序列预测模型对现象的未来进行预测。其原理是任一期的指数平滑值都是本期实际观察值与前一期指数平滑值的加权平均 。根据平滑次数不同,指数平滑法分为一次指数平滑法、二次指数平滑法和三次指数平滑法等。但它们的基本思想都是:预测值是以前观测值的加权和,且对不同的数据给予不同的权数,新数据给予较大的权数,旧数据给予较小的权数。


4.优缺点


优点


指数平滑法数据需求量小,只需要少数数据即可对未来需求进行预测,对数据存储的需求也非常小,易于进行系统化和自动化。

而且计算也相对比较简单,进行预测建模操作也简单,容易理解且运行成本低。

自适应指数平滑法克服了平滑系数值的选择问题,具有自适应性,预测模型能够自动识别数据变化而加以调整。

Holt双参数指数平滑法和Holt-Winters三参数指数平滑法使用多个平滑系数,能有效的预测和把握时间序列未来的趋势和季节性,从而有效的应对时间序列的变化。


缺点


指数平滑法预测一句来源于历史数据,无法识别诸如价格,广告实时变化波动等因果因素带来的需求变化,不能利用解析性变量进行需求塑造。

指数平滑法较难找到最优的指数平滑系数,对需求变化的调整存在滞后性,无法一定时间内需求突变进行预测。

指数平滑法能很好的预测未来1-3期的需求,但对于更远时期的预测效果不佳。因此指数平滑法只适合做短期预测。


二、一次指数平滑法


1.预测原理及公式


设时间序列为gif.gif为加权系数,gif.gif一次指数平滑公式为:

99314d574f3245759f0028424f0979dc.png

d6af48825cfb437d974841df90e0670a.png

gif.gif为t+1时刻的预测值,即t时刻的平滑值gif.gif/,gif.gif为t时刻的实际值,gif.gif为t时刻的预测值,即为上一时刻的平滑值gif.gif很明显该公式是由移动平均公式改进而来。

上一章我们知道移动平均数的递推公式为:

5b8275c9df26455ba554c0ae45592a00.png

gif.gif作为gif.gif的最佳估计,则有

392ff852bb244402b4832b7d16a59fd0.png

gif.gifgif.gif代替gif.gif即得

4ccaa3afe14d44a385afaeb0ddf3c197.png

我们可以试着把该公式展开,会发现:


1ce05a0dd06949ed86209ae99936db10.png

表明gif.gif是全部历史数据的加权平均,加权系数分别为gif.gif显然有:b056338198894b6391cf31d9423e9b2a.png


由于加权系数符合指数规律,又具有平滑数据的功能,故称为指数平滑。以这种平滑值进行预测,就是一次指数平滑法。预测模型为:


c69166419e5949f792cf2d25c09f175b.png


即:


8b5d41819c424cc3b89592658819db44.png


也就是以第t时刻指数平滑值作为t+1时刻预测值。


可以看出,在指数平滑法中,所有先前的观测值都对当前的平滑值产生了影响,但它们所起的作用随着参数 的幂的增大而逐渐减小。那些相对较早的观测值所起的作用相对较小。同时,称 α 为记忆衰减因子可能更合适——因为 α 的值越大,模型对历史数据“遗忘”的就越快。从某种程度来说,指数平滑法就像是拥有无限记忆(平滑窗口足够大)且权值呈指数级递减的移动平均法。


2.加权系数的选择

在进行指数平滑时,加权系数的选择是很重要的。gif.gif的大小规定了在新预测值中新数据和原预测值所占的比重。gif.gif值越大,新数据所占的比重就越大,原预测值所占的比重就越小,反之亦然。

99314d574f3245759f0028424f0979dc.png

从上面可以看出,新预测值是根据预测误差对原预测值进行修正而得到的。gif.gif的大小则体现了修正的幅度,gif.gif值越大,修正幅度越大,反之越小。

若选取则gif.gif=0c5d3ca1a76204f93821357da8980a167.png即下期预测值就等于本期预测值,在预测过程中不考虑任何新信息;若选取gif.gif=1,则226a1f1a25f54b7e8b31ae03b8aec2dd.png,即下期预测值就等于本期观测值,完全不相信过去的信息。这两种极端情况很难做出正确的预测。因此,\alpha值应根据时间序列的具体性质在0~1之间选择。具体如何选择一般可遵循下列原则:


如果时间序列波动不大,比较平稳,则应取小一点,如(0.1~0.5)。以减少修正幅度,使预测模型能包含较长时间序列的信息;

如果时间序列具有迅速且明显的变化倾向,则应取大一点,如(0.6~0.8)。使预测模型灵敏度高一些,以便迅速跟上数据的变化。

在实际运用上,类似移动平均法,多几个值进行试算,看哪个预测误差小,就采用哪个。


3.初始值的确定


用一次指数平滑法进行预测,除了选择合适的外,还要确定初始值gif.gif。初始值是由预测值估计或指定的。当时间序列的数据较多,比如20个以上,初始值对以后的预测值影响很少,可选用第一期数据为初始值。如果时间序列的数据较少,在20以下时,初始值对以后的预测值影响很大,这时就必须认真研究如何正确确定初始值。一般以最初几期实际值的平均值作为初始值。


4.实例运用


一次指数平滑法相对很简单,我们仍然以某化学反应里,测得生成物浓度y(%)与时间t(min)的数据为例子:


a8e6884e6de7495286b744fe3f848fb9.png


3a7ef9b8cdf744f6a9550e992a98a2b6.png

我们以t为15的时刻对应的数值来预测第16时刻的值

#输入预测集合y以及时间窗口数n,a为加权系数
def SES(y,n,a):
    y_S=[]
    S_0=0
    for i in range(n):
        S_0=y[i]+S_0
    S_0=S_0/n
    for i in range(0,y.size):
        S_i=a*y[i]+(1-a)*S_0
        y_S.append(S_i)
        S_0=S_i
    return y_S
y1=SES(y,3,0.2)
y2=SES(y,3,0.5)
y3=SES(y,3,0.8)

当\alpha为0.2时15时刻为10.02,当为\alpha为0.5时为10.52,当\alpha为0.8时为10.57

那么我们以gif.gif为0.8时为例:

gif.gif

由上述例题可得结论:


指数平滑法对实际序列具有平滑作用,权系数(平滑系数)a  越小,平滑作用越强,但对实际数据的变动反应较迟缓。


在实际序列的线性变动部分,指数平滑值序列出现一定的滞后偏差的程度随着权系数(平滑系数)a  的增大而减少,但当时间序列的变动出现直线趋势时,用一次指数平滑法来进行预测仍将存在着明显的滞后偏差。因此,也需要进行修正。修正的方法也是在一次指数平滑的基础上再进行二次指数平滑,利用滞后偏差的规律找出曲线的发展方向和发展趋势,然后建立直线趋势预测模型,故称为二次指数平滑法。

目录
相关文章
|
12天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
23 6
|
25天前
|
存储 缓存 测试技术
Python中的装饰器:功能增强与代码复用的利器
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者以简洁优雅的方式增强函数或方法的功能。本文将深入探讨装饰器的定义、工作原理、应用场景以及如何自定义装饰器。通过实例演示,我们将展示装饰器如何在不修改原有代码的基础上添加新的行为,从而提高代码的可读性、可维护性和复用性。此外,我们还将讨论装饰器在实际应用中的一些最佳实践和潜在陷阱。
|
26天前
|
人工智能 数据挖掘 Python
Python编程基础:从零开始的代码旅程
【10月更文挑战第41天】在这篇文章中,我们将一起探索Python编程的世界。无论你是编程新手还是希望复习基础知识,本文都将是你的理想之选。我们将从最基础的语法讲起,逐步深入到更复杂的主题。文章将通过实例和练习,让你在实践中学习和理解Python编程。让我们一起开启这段代码之旅吧!
|
5天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
36 8
|
12天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
35 11
|
14天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
31 11
|
10天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
11天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
35 6
|
15天前
|
Python
如何提高Python代码的可读性?
如何提高Python代码的可读性?
30 4
|
15天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。