猿创征文|时间序列分析算法之二次指数平滑法和三次指数平滑法详解+Python代码实现

简介: 猿创征文|时间序列分析算法之二次指数平滑法和三次指数平滑法详解+Python代码实现

前言


好久没来更时间序列分析算法了,今天把平滑法这一个常用且宽泛的时序算法给补完。这篇文章完结了就代表整个传统时序预测算法讲完了。文章内容是紧接着上篇文章:


一文速学-时间序列分析算法之指数平滑法详解+Python代码实现_fanstuck的博客-CSDN博客_指数平滑法python


ffcc7ff817f54fc28f3e0e7afcfe2413.png


下篇文章就是详解单变量时间序列预测的所有模型和算法了。此系列将会一直写到现在比较火热的LSTM短时时序预测以及更多先进且方便的时序预测算法。

希望读者看完能够在评论区提出错误或者看法,博主会长期维护博客做及时更新。


二次指数平滑法(Holt’s linear trend method)


从我们之前学过的简单移动平均法和在此基础之上衍生出来的二次移动平均法(又称趋势移动平均法),一次指数平滑法和二次指数平滑法二者关系与之类似,可以说原理都一样。


1.定义


在一次指数平滑法的基础之上再去做趋势移动。当时间序列的变动出现直线趋势时,用一次指数平滑法来进行预测仍将存在着明显的滞后偏差。修正的方法也是在一次指数平滑的基础上再进行二次指数平滑,利用滞后偏差的规律找出曲线的发展方向和发展趋势,然后建立直线趋势预测模型,故称为二次指数平滑法。


2.公式

我们再来看看一次指数平滑法的公式:

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

cc2d423be48c4a2eb4381d072abf45f8.pnga0b73ac45a104f978c6d1fff7943afbc.png


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

我们和二次移动平均法一样如法炮制计算。


二次指数平滑值

c68684917f41484f8f259c4fd7706333.png


公式中:

  • gif.gif:第t周期的二次指数平滑值
  • S^{(1)}_t:第t周期的一次指数平滑值
  • :gif.gif第t-1周期的二次指数平滑值
  • :gif.gif加权系数(平滑系数)

很容易看出二次指数平滑法是对一次指数平滑值再一次指数平滑的方法。所以说还得使用一次指数平滑法之后再作计算。


二次指数平滑数学模型:


4bdcdb46dc494b01889a5e749f805ff5.png

3.案例实现


这里我们不再使用上次化学实验的案例1,换个一个案例:

以我国 1965~1985 年的发电总量资料为例,试用二次指数平滑法预 测 1986 年和 1987 年的发电总量:



d62090598ae9495486fe83a76fb2ccb3.png

那么我们只需要读入数据再将我们之前写的SES一次平滑指数法引入就好了:

import pandas as pd
import numpy as np
import Ipynb_importer
import SES
df=pd.read_excel('try_test2.xlsx')

首先我们获取一次平滑值,平滑系数还是为0.3:

df=pd.read_excel('try_test2.xlsx')
x=df['t']
y=df['发电总量y']
y_1=SES(y,1,0.3)
y_1


29832afea2b043f2a87ab304791eddf5.png


我们获取二次平滑值只需要将一次平滑值再次代入就可以得到:

y_2=SES(y_2,1,0.3)
y_2

50b5417c1ab6458ca92a0da844d27c02.png


那么如果我们要预测t为21时刻的值时,我们需要得到a和b两个参数的值:

#我们需要传入一次平滑预测值和二次平滑预测值,以及t值、平滑系数a和给予的T
def SES_quadratic(y_1,y_2,s,t,T):
    a=2*y_1[t-1]-y_2[t-1]
    b=(s/(1-s))*(y_1[t-1]-y_2[t-1])
    y=a+b*T
    return y
SES_quadratic(y_1,y_2,0.3,21,1)


这样我们就得到了 t为22时刻的预测值:



b994568c019644399e7d5fa81674f647.png

3b62fc610ef3493a9151d32a476a7d8a.png


三次指数平滑法(Holt-Winters’ seasonal method)


1.定义


一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但是没有季节特性的时间序列,三次指数平滑法则可以预测具有趋势和季节性的时间序列。术语“Holt-Winter”指的是三次指数平滑。该方法分为预测方程和三个平滑方程,一个是水平,一个是趋势,一个是季节性成分,采用平滑参数和,用代表季节性周期,例如一年中季节的数量,季的数量,月的数量。


直接我们在将时间序列数据的时候谈到,时间序列有一下四个时序特性:


长期趋势(Trend)

季节变化(Season)

循环波动(Cyclic)

不规则波动(Irregular)

其中季节变化也正是三次指数平滑法所代表的平滑。下面网址就是全述季节性预测算法:


7.3 Holt-Winters’ seasonal method | Forecasting: Principles and Practice (2nd ed)


之前我在第一篇文章也说过:


四种影响因素通常有两种组合方式:


一种是加法模型:Y=T+S+C+I,认为数据的发展趋势是4种影响因素相互叠加的结果


一种是乘法模型:Y=T*S*C*I,认为数据的发展趋势是4种因素相互综合的结果


该方法有两种变体,根据季节性成分的性质不同而不同。当季节变化在整个系列中大致恒定时,优选加法模型,而当季节变化与系列水平成比例时,优选乘法模型。使用相加法,季节性分量在观测序列的尺度中以绝对值表示,在水平方程中,通过减去季节性分量对序列进行季节性调整。在每年内,季节性成分的总和将接近零。使用乘法方法,季节性成分以相对项(百分比)表示,通过除以季节性成分对序列进行季节性调整。每年内,季节性成分总计约为m。


那么Holt-Winters 加法模型为:


e71d5c54a46c439ea8ec3b92f99bf89b.png


其中k是(h−1) /m的整数部分,这确保用于预测的季节性指数的估计来自样本的最后一年。水平方程显示了经季节性调整的观测值(gif.gif)之间的加权平均值,以及非季节性预测(gif.gif)对于时间t,趋势方程与Holt的线性方法相同。季节方程显示当前季节指数(gif.gif)之间的加权平均值 ,以及去年同一季节(即m个时间段之前)的季节性指数。


季节性分量的方程通常表示为:

2a4dad749ea649ceaadeb26d98380d13.png

如果我们替换ℓ从上述分量形式的水平的平滑方程,我们得到


5491b9bca3cd47229d7dd28447872110.png

相应的,乘法模型为:

6575b0729dfa4cdb98c8e0c95a177a2b.png


2.公式


我们大可不需要再次重新认识三次指数平滑法,三次平滑法无非就是在二次平滑法的基础之上再次平滑一次而已。那么推导公式就更加简单了:


0352da113e494eaa85dc1487a08a5f2a.png

其三次平滑值的公式为:

94d9fb2e5be64f83955f6f1b7c9a584d.png


式中gif.gif为三次指数平滑值。

三次指数平滑法的预测模型为:


2fa434a79fca43db9d180e5d553b7087.png

3.案例实现


我们的案例依旧和二次指数平滑法的案例一样,省的大家再去理解其他案例场景。

我们可以先进行绘图描点看看这些数据是否用三次指数平滑法更合适:


import matplotlib.pyplot as plt
df=pd.read_excel('try_test2.xlsx')
x=df['t']
y=df['发电总量y']
plot1 = plt.plot(x, y, '*', label='origin data')
plt.title('metric_polyfit')
plt.show()

7d44751793c941d5989c3cf4ff67bb4f.png


那么我们发现这个案例的数据是呈线性递增趋势,那么我们还得换个案例。这里选用上次化学反应的案例最好用。


以在某化学反应里,测得生成物浓度y(%)与时间t(min)的数据为例子:


290aa62a71134009b8819aa7e7dc92e6.png

8065625a4d6541c0979e99466019dc80.png

通过实际数据序列呈非线性递增趋势,采用三次指数平滑预测方法。


确定指数平滑的初始值和权系数(平滑系数)a。设一次、二次、三次指数平滑的初始值为最早三个数据的平均值。即:


gif.gif


gif.gif为0.3,那么我们将gif.gif先求出来:

y_1=SES(y,3,0.3)
y_2=SES(y_1,3,0.3)
y_3=SES(y_2,3,0.3)


之后我们使用python写出代码就好了:

#我们需要传入一次平滑预测值、二次平滑预测值和三次平滑预测值,以及t值、平滑系数a和给予的T
def SES_triple(y_1,y_2,y_3,s,t,T):
    t=t-1
    a=y_1[t]*3-y_2[t]*3+y_3[t]
    b=(s/(2*((1-s)**2)))*((6-5*s)*y_1[t]-2*(5-4*s)*y_2[t]+(4-3*s)*y_3[t])
    c=((s**2)/(2*((1-s)**2)))*(y_1[t]-2*y_2[t]+y_3[t])
    y=a+b*T+c*T**2
    return y
SES_triple(y_1,y_2,y_3,0.3,16,1)

393ca143bf704bb79ab1966fbfe82e0e.png


加权系数a的选择

在指数平滑法中,预测成功的关键是 a 的选择。a 的大小规定了在新预测值中新数据和原预测值所占的比例。a 值愈大,新数据所占的比重就愈大,原预测值所占比重就愈小,反之亦然。


       理论界一般认为有以下方法可供选择:


       经验判断法。这种方法主要依赖于时间序列的发展趋势和预测者的经验做出判断。


1、当时间序列呈现较稳定的水平趋势时,应选较小的α值,一般可在0.05~0.20之间取值;


2、当时间序列有波动,但长期趋势变化不大时,可选稍大的α值,常在0.1~0.4之间取值;


3、当时间序列波动很大,长期趋势变化幅度较大,呈现明显且迅速的上升或下降趋势时,宜选择较大的α值,如可在0.6~0.8间选值,以使预测模型灵敏度高些,能迅速跟上数据的变化;


4、当时间序列数据是上升(或下降)的发展趋势类型,α应取较大的值,在0.6~1之间。


       试算法。根据具体时间序列情况,参照经验判断法,来大致确定额定的取值范围,然后取几个α值进行试算,比较不同α值下的预测标准误差,选取预测标准误差最小的α。


       在实际应用中预测者应结合对预测对象的变化规律做出定性判断且计算预测误差,并要考虑到预测灵敏度和预测精度是相互矛盾的,必须给予二者一定的考虑,采用折中的α值。

目录
相关文章
|
5天前
|
人工智能 数据挖掘 数据处理
揭秘Python编程之美:从基础到进阶的代码实践之旅
【9月更文挑战第14天】本文将带领读者深入探索Python编程语言的魅力所在。通过简明扼要的示例,我们将揭示Python如何简化复杂问题,提升编程效率。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编码世界的大门。让我们开始这段充满智慧和乐趣的Python编程之旅吧!
|
1天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
15 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
7天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
24 6
基于Python访问Hive的pytest测试代码实现
|
3天前
|
设计模式 开发框架 缓存
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第16天】在Python的世界里,装饰器宛如一位巧手魔术师,轻轻一挥魔杖,便能让我们的函数和类焕发新生。本文将带你领略装饰器的魔力,从基础概念到实战应用,一步步解锁装饰器的强大潜能。让我们一起踏上这段奇妙的旅程,探索如何用装饰器简化代码,增强功能。
|
5天前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
21 12
|
5天前
|
测试技术 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第14天】在编程世界中,我们总是寻找使代码更简洁、更强大的方法。Python的装饰器正是这样一项工具,它允许我们在不修改原有函数代码的情况下,增加额外的功能。本文将通过实际示例,引导你理解装饰器的基本概念,展示如何创建和应用它们,以及如何利用装饰器简化日常编程任务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和技巧,让你的代码更加高效和优雅。
21 12
|
6天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第13天】本文深入探讨了Python中一个强大而常被误解的特性——装饰器。我们将从基础概念入手,逐步揭示其背后的原理,并通过实际示例展示如何利用装饰器来简化代码和扩展函数功能。文章不仅为初学者提供了清晰的入门指南,还为有经验的开发者展示了高级用法,旨在帮助读者更好地理解和运用装饰器,以提升编码效率和程序的可维护性。
24 10
|
3天前
|
测试技术 Python
Python中的装饰器:简化代码的魔法
【9月更文挑战第16天】在Python编程的世界里,装饰器就像是一把瑞士军刀,它们为函数和类赋予了额外的超能力。本文将带你探索装饰器的秘密,了解如何利用这一工具来简化代码、增强可读性并提升效率。从基础概念到实际案例,我们将一步步揭示装饰器的神秘面纱,让你的代码更加优雅和强大。
|
1天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
9 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
3天前
|
设计模式 缓存 开发者
探索Python中的装饰器:提升代码复用性的利器
本文深入探讨了Python中强大的装饰器功能,揭示了其如何通过元编程和闭包等技术手段,优雅地实现代码的复用与扩展。从基本概念到高级应用,我们将一步步揭开装饰器背后的奥秘,并通过实例展示其在实际项目开发中的巨大价值。无论是想要简化函数调用流程、增强函数功能,还是实现AOP(面向切面编程),掌握装饰器都是每位Python开发者必备的技能。