python数学建模--时间序列模型--指数平滑

news2024/10/6 6:44:15

目录

  • 时间序列
  • 指数平滑
    • 一次指数平滑
      • 预测示例
    • 二次指数平滑
      • 预测示例
    • 三次指数平滑

本博客参考:《python数学实验与建模 》

时间序列

时间序列数据是按照时间顺序排列的、随着时间变化且相互关联的数据序列,这类数据往往反映了某一事物、现象等随时间的变化状态或程度
常用的时间序列预测方法有多种:移动平均法、加权序时平均数法、移动平均法、加权移动平均法、趋势预测法、指数平滑法、季节性趋势预测法、市场寿命周期预测法等等,本篇博客浅谈指数平滑法

指数平滑

指数平滑法实际上是一种特殊的加权移动平均法,与一次移动平均法相比,后者认为最近N期数据对于未来的值影响相同,即都加权 1 N \frac{1}{N} N1;并且N以前的数据对未来值没有影响,加权为0,即某一期的预测值为
y t p = 1 N ( y t − 1 + . . . . + y t − N ) y_{t}^p=\frac{1}{N}(y_{t-1}+....+y_{t-N}) ytp=N1(yt1+....+ytN)

二次移动平均法更高次移动平均法的权数不是 1 N \frac{1}{N} N1,并且次数越高,权数的结构越复杂,但是永远保持对称的权数,即两端项权数小、中间项权数大,这种方法的缺点是预测值总是停留在过去的水平上而无法预计会导致将来更高或更低的波动,不符合一般系统的动态性
一般,历史数据对于未来值的影响是随时间间隔的增长而是递减的,下面我们对指数平滑法的原理进行简要说明

一次指数平滑

设原始时间序列为
y = [ y 1 , y 2 , . . . , y t ] y=[y_1,y_2,...,y_t] y=[y1,y2,...,yt]
设加权系数 α \alpha α 0 < α < 1 0<\alpha<1 0<α<1

假设我们想要知道 y t + 1 y_{t+1} yt+1的值,那么经过一次指数平滑预测,我们可以得到

y t + 1 p = S t ( 1 ) = α y t + ( 1 − α ) S t − 1 ( 1 ) = S t − 1 ( 1 ) + α ( y t − S t − 1 ( 1 ) ) = y t p + α ( y t − y t p ) ( y t p 表 示 y t 的 预 测 值 ) (1) \begin{aligned} y^{p}_{t+1}=&S_t^{(1)}\\ =&\alpha y_t+(1-\alpha)S^{(1)}_{t-1} \tag{1}\\ =&S^{(1)}_{t-1}+\alpha(y_t-S^{(1)}_{t-1}) \\ =&y_t^{p}+\alpha(y_t-y_{t}^p) &&(y^p_t表示y_t的预测值) \end{aligned} yt+1p====St(1)αyt+(1α)St1(1)St1(1)+α(ytSt1(1))ytp+α(ytytp)(ytpyt)(1)

  1. S t ( 1 ) S^{(1)}_t St(1)表示第t次的一次指数平滑值,将其展开
    S t ( 1 ) = α y t + ( 1 − α ) S t − 1 ( 1 ) = α y t + ( 1 − α ) [ α y t − 1 + ( 1 − α ) S t − 2 ( 1 ) ] = . . = α ∑ i = 0 ∞ ( 1 − α ) i y t − i \begin{aligned} S^{(1)}_t=&\alpha y_t+(1-\alpha)S^{(1)}_{t-1}\\ =&\alpha y_t+(1-\alpha)[\alpha y_{t-1}+(1-\alpha)S^{(1)}_{t-2}]\\ =&..\\ =&\alpha\sum^{\infty}_{i=0} (1-\alpha)^iy_{t-i} \end{aligned} St(1)====αyt+(1α)St1(1)αyt+(1α)[αyt1+(1α)St2(1)]..αi=0(1α)iyti
    从上面的式子中我们会发现 S t ( 1 ) S_t^{(1)} St(1)的实质是全部原始数据的加权平均值
  2. 加权系数 α \alpha α规定了新数据和原数据所占比重的大小
    从式子(2)中我们可以看出,新的预测值是根据预测误差对原预测值进行修正得到的,加权系数的大小代表着修正幅度的大小,下面我们来看两种极端情况

α = 0 \alpha=0 α=0表示下期预测值等于本期预测值,即不考虑任何新的信息
α = 1 \alpha=1 α=1表示下期预测值等于本期预测值,即完全不相信过去的信息

上述情况对现实中的数据预测意义不大,因此我们要选择合适的加权系数使得 0 < α < 1 0<\alpha<1 0<α<1,选取原则如下:
(1)时间序列波动不大且比较平稳, α \alpha α值应小一些,这样可以使得模型能够包含较长时间序列的信息
(2)时间序列具有迅速且明显的变动倾向, α \alpha α值应大一些,使得模型的预测值能够迅速跟上数据的变化
3. 关于初始指数平滑值 S 0 ( 1 ) S^{(1)}_0 S0(1)
(1)当时间序列的数据较多(n>20), S 0 ( 1 ) S^{(1)}_0 S0(1)对于后面的预测值影响很小,可取时间序列的初始值作为 S 0 ( 1 ) S^{(1)}_0 S0(1),即 S 0 ( 1 ) = y 0 S^{(1)}_0=y_0 S0(1)=y0
(2)当时间序列的数据较少(n<20), S 0 ( 1 ) S^{(1)}_0 S0(1)对于后面的预测值影响较大,可以取最初m个时间序列数据的平均值作为 S 0 ( 1 ) S^{(1)}_0 S0(1),即 S 0 ( 1 ) = y 0 + y 1 + . . . + y m m S^{(1)}_0=\frac{y_0+y_1+...+y_m}{m} S0(1)=my0+y1+...+ym

预测示例

已知美国1790-2000年每隔10年的人口数据,请对2010年的美国人口进行预测

年份1790180018101820183018401850186018701880189019001910192019301940195019601970198019902000
人口3.95.37.29.612.917.123.231.438.650.262.976.092.0106.5123.2131.7150.7179.3104.0226.5251.4281.4

(1)加权系数 α \alpha α的确定
仅仅从初始数据,我们并不能看出数据特征,因此我们尝试选取不同的加权系数并查看各自的预测效果,我们将分别取 α = 0.2 、 0.5 、 0.8 \alpha=0.2、0.5、0.8 α=0.20.50.8

(2)取初始指数平滑值 S 0 ( 1 ) = y 0 = 5.3 S^{(1)}_0=y_0=5.3 S0(1)=y0=5.3
(3)根据预测模型: y t + 1 p = y t p + α ( y t − y t p ) y^{p}_{t+1} =y_t^{p}+ \alpha(y_t-y_{t}^p) yt+1p=ytp+α(ytytp)进行预测

代码

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
y=np.array([3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,
           38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,
           150.7,179.3,204.0,226.5,251.4,281.4])
y.shape
>>> (22,)       
# 定义一次指数平滑函数
def expmove(y,alpha):
    n=len(y)
    M=np.zeros(n)# 生成空序列,用于存储指数平滑值M
    M[0]=y[0]# 初始指数平滑值的赋值
    for i in range(1,len(y)):
        M[i]=alpha*y[i-1]+(1-alpha)*M[i-1]# 开始预测
    return M   
# 使用三种alpha值查看预测效果
y_pred1=expmove(y,0.2)
y_pred2=expmove(y,0.5)
y_pred3=expmove(y,0.8)# 注意,此处的y_pred是一个预测序列,并非一个值
# 查看预测数据
d=pd.DataFrame(np.c_[y,y_pred1,y_pred2,y_pred3])
d

在这里插入图片描述

# 可视化查看预测值与真实值的对比
plt.figure(figsize=(12,8))
plt.plot(y,label='y')
plt.plot(y_pred1,label='y1')
plt.plot(y_pred2,label='y2')
plt.plot(y_pred3,label='y3')
plt.grid()
plt.legend()           

运行结果
在这里插入图片描述
从上面的图像中我们看到 α = 0.8 \alpha=0.8 α=0.8的预测效果更好,我们使用 α = 0.8 \alpha=0.8 α=0.8预测时间序列的下一期数据

y_pred2010=0.8*y_pred3[-1]+(1-0.8)*y_pred3[-1]
y_pred2010
>>> 245.26975527147619

二次指数平滑

当时间序列的变动出现直线趋势时,一次指数平滑预测值存在明显的滞后偏差1,因此需要将这种滞后误差加以修正,可以在一次指数平滑的基础上进行二次指数指数平滑

上面我们我们知道一次指数平滑值
S t ( 1 ) = S t − 1 ( 1 ) + α ( y t − S t − 1 ( 1 ) ) (1) S_t^{(1)} = S^{(1)}_{t-1}+\alpha(y_t-S^{(1)}_{t-1})\tag{1} St(1)=St1(1)+α(ytSt1(1))(1)
那么二次指数平滑值
S t ( 2 ) = a S t ( 1 ) + ( 1 − α ) S t − 1 ( 2 ) (2) S^{(2)}_t=aS^{(1)}_t+(1-\alpha)S_{t-1}^{(2)}\tag{2} St(2)=aSt(1)+(1α)St1(2)(2)
当时间序列 y t y_t yt从某时期开始具有直线趋势,可用直线
y t + m p = a t + b t m ( 其 中 m 表 示 待 预 测 的 第 m 期 数 据 ) (3) y_{t+m}^p=a_t+b_tm(其中m表示待预测的第m期数据)\tag{3} yt+mp=at+btmmm(3)
进行趋势预测,截距和斜率的值如下2

{ a t = 2 S t ( 1 ) − S t ( 2 ) b t = α 1 − α ( S t ( 1 ) − S t ( 2 ) ) \begin{cases} a_t=2S_t^{(1)}-S_t^{(2)}\\ b_t=\frac{\alpha}{1-\alpha}(S_t^{(1)}-S_t^{(2)}) \end{cases} {at=2St(1)St(2)bt=1αα(St(1)St(2))

预测示例

已知某家具城近十年的销售额如下,请预测该家具城明、后两年的销售额

年份201320142015201621720182019202020212022
销售额2828294929953181322033843497370238133948

(1)加权系数 α \alpha α的确定
根据上述数据我们可以看出数据的波动不大,基本呈线性趋势,因此我们可以将加权系数的值适当取小一些,取 α = 0.4 \alpha=0.4 α=0.4

(2)取初始指数平滑值 S 0 ( 1 ) = S 0 ( 2 ) = y 0 = 2828 S^{(1)}_0=S^{(2)}_0=y_0=2828 S0(1)=S0(2)=y0=2828
根据公式(1)(2)计算指数平滑值

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
alpha=0.4
# 定义指数平滑函数
def expmove(y,alpha=0.4):
    n=len(y)
    M=np.zeros(n)# 生成空序列,用于存储指数平滑值M
    M[0]=y[0]# 初始指数平滑值的赋值
    for i in range(1,len(y)):
        M[i]=alpha*y[i-1]+(1-alpha)*M[i-1]# 开始预测
    return M  
# 一次指数平滑序列
ss1=expmove(y)
# 二次指数平滑序列
ss2=expmove(ss1)

(3)根据公式(3)对时间序列的值进行预测

# 预测原时间序列
y_pred=np.zeros(len(y))
for i in range(1,len(y)):
    y_pred[i]=2*ss1[i-1]-ss2[i-1]+alpha/(1-alpha)*(ss1[i-1]-ss2[i-1])
# 2023
y_pred2023=2*ss1[-1]-ss2[-1]+alpha/(1-alpha)*(ss1[-1]-ss2[-1])*1
# 2024
y_pred2024=2*ss1[-1]-ss2[-1]+alpha/(1-alpha)*(ss1[-1]-ss2[-1])*2
y_pred2023,y_pred2024
>>>(4128.513034240001, 4335.155486720001)
# 查看预测数据
d=pd.DataFrame(np.c_[y,ss1,ss2,y_pred])
d

运行结果
在这里插入图片描述

# 对预测数据进行简单的处理
y_pred=np.append(y_pred,[y_pred2023,y_pred2024])
y_pred[0]=y[0]
# 可视化查看预测值与真实值的对比
plt.figure(figsize=(12,8))
plt.plot(y,label='y')
plt.plot(ss1,label='ss1')
plt.plot(ss2,label='ss2')
plt.plot(y_pred,label='y_pred')
plt.grid()
plt.legend() 

运行结果
在这里插入图片描述

三次指数平滑

To be continued


  1. 这里应该是需要推导一下的 ↩︎

  2. 这里应该也需要推导一下 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

升级光伏供应链体系,供应商系统规范供应商管理,促进企业与供应商高效协同

作为过去十年我国发展最快的可再生能源&#xff0c;截止到2020年光伏累计装机量达到253GW&#xff0c;过去10年复合增长率达到20%以上&#xff0c;新增光伏装机48.2GW&#xff0c;同比增长60%。全球可再生能源署预计2050年光伏累计装机规模将达8519GW&#xff0c;成为最主流的电…

【MySQL】 B+ 树存储的原理

1. B 树 和 B 树 B Tree 模拟生成工具&#xff1a;https://www.cs.usfca.edu/~galles/visualization/BTree.html BTree 模拟生成工具&#xff1a; https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html B 树 —— 1970年&#xff0c;R.Bayer和E.mccreight提出了一种…

[附源码]java毕业设计学生量化考核管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

LIN休眠唤醒及测试心得

上期LIN测试小课堂&#xff0c;我们分享了LIN总线帧结构及各场干扰&#xff0c;如何测试样件是否不响应错误的帧结构。 这次我们的介绍主题是LIN休眠唤醒&#xff0c;一起看看标准和差异性&#xff0c;开发和测试的关系&#xff0c;实际的案例分享也来了。 一、LIN控制器休眠…

编译原理—语义分析、语法制导翻译、翻译模式、中间代码生成

编译原理—语义分析、语法制导翻译、翻译模式、中间代码生成语法制导翻译语法制导定义(属性文法)翻译模式后缀式图示表示法构建表达式的语法树中间代码的种类三地址码四地址码对比举例中间代码产生的场景说明语句的翻译举例嵌套说明语句的翻译方案相关定义举例过程嵌套声明记录…

BDP FL-PEG5-炔丙基,2093197-93-2,BDP FL-PEG5-propargyl是一种 BDP FL 接头

BDP FL-PEG5-propargyl ​中英文名&#xff1a; CAS号&#xff1a;2093197-93-2| 英文名&#xff1a;BDP FL-PEG5-propargyl |中文名&#xff1a;BDP FL-五聚乙二醇-炔基&#xff0c; BDP FL-PEG5-炔丙基BDP FL-PEG5-propargyl ​物理参数&#xff1a; CASNumber&#xff1a;20…

微信小程序基础学习(5):使用 npm包、全局数据共享、分包

1. 使用 npm包 1.1 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用 npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用 npm 包有如下 3 个限制&#xff1a; 不支持依赖于 Node.js 内置库的包。不支持依赖于浏览器…

查看进程信息(ps、top) + 操作后台进程(jobs、bg、fg)

目录 1、查看进程信息 (1) 查看进程快照 —— ps (2) 查看进程的动态信息 —— top (3) 查看进程的详细信息 —— /proc 2、操作后台进程 (1) 将进程转为后台 (2) 将后台进程转为前台运行 fg (3) 查看后台进程 jobs 1、查看进程信息 (1) 查看进程快照 —— ps 所谓…

Word控件Spire.Doc 【图像形状】教程(3) :在 C#/VB.NET 中的指定位置插入图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【无标题】接口测试遇到的典型bug纪录

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Java#22(内部类)

目录 一.内部类 1.什么是内部类? 2.什么时候用? 3.特点 二.成员内部类,静态内部类,局部内部类(稍微了解即可) 1.获取成员内部类对象的两种方式? 2.外部类成员变量和内部类成员变量重名时&#xff0c;在内部类如何访问? 2.静态内部类 3.局部内部类 三. 匿名内部类…

verdi基础操作

看波形&#xff1a; 1.代码里选中&#xff0c;再按鼠标中键拖进去 2.选中&#xff0c;ctrlw 3.用get signal 在波形框中&#xff0c;按照鼠标左键再左右移动&#xff0c;可以放大这一部分的波形&#xff0c;还有下面的功能键可以用 删除波形&#xff1a; 按delete或者cut掉…

如何压缩图片200k以下?

“图片过大无法上传”&#xff0c;“因您上传的图片大小超过限制”这样的提示大家都有遇到过吧&#xff1f;这就是告诉我们现在的图片需要压缩一下才能继续使用了&#xff0c;否则我们就无法使用当前照片了。 那有很多平台&#xff0c;特别是上传一些证件照的时候&#xff0c;要…

北京筑龙获爱分析采购数字化报告大满贯, 领跑供应链协同市场

2022年11月21日&#xff0c;国内领先的数字化市场研究咨询机构爱分析发布了《2022爱分析采购数字化厂商全景报告》&#xff08;以下简称《报告》&#xff09;。北京筑龙凭借专业的数字化技术、采购供应链数字化经验以及在政企数字化领域积累的丰富项目实践经验&#xff0c;成功…

微信小程序商城搭建步骤_我们来说说微信小程序商城开发的作用

比如下面我推荐的这个就有很多不错的各行业商城小程序模板&#xff0c;新手也能轻松搭建的那种&#xff01;&#xff08;见我主页&#xff09; 但要想把商城小程序运营到能稳定赚钱&#xff0c;就需要商家结合自身的实际&#xff0c;去指定合适的推广策略。下面就讲讲如何实现线…

第4章 配置集成第3方log4net日志中间件

在上一章中虽然已经把第3方log4net日志中间件定义到了当前程序中&#xff0c;但是并没有把第3方log4net日志中间件的功能配置并集到当前程序中&#xff0c;即当前程序还不能通过第3方log4net日志中间件把日志数据信息持久化到指定的文件或表中&#xff0c;本章即将实现当前程序…

SpringBoot2.X与redis Lettuce集成踩坑

起因 最近项目上发现一个问题&#xff0c;redis cluster集群有一台机崩了之后&#xff0c;后台服务的redis会一直报错&#xff0c;无法连接到redis集群。通过命令查看redis集群&#xff0c;发现redis cluster集群是正常的&#xff0c;备用的slave机器已经升级为master。 于是初…

c<7>存储

目录 1&#xff0c;局部变量 1,auto 2,static 2&#xff0c;全局变量的储存类型 3,register 4,extern 作用&#xff1a; 1&#xff0c;局部变量 #include <stdio.h> int main() {int fAuto(int a);int fStatic(int a); //函数声明int a 1, i; //自动局部变…

去了家新公司,技术总监不让用 IntelliJ IDEA想离职了

最近有个小伙伴微信和我说&#xff0c;新去的一家公司&#xff0c;技术团队全部规定要用的 Eclipse 开发&#xff0c;技术总监不让用 IntelliJ IDEA&#xff0c;付费也不行&#xff0c;说想离职了&#xff0c;问我该怎么办。 首先听到这件事情的时候&#xff0c;我表示十分理解…

关于消息队列的那些事

目录为什么需要消息队列1.异步处理2.服务解耦3.流量控制消息队列1.两种模型2.基本原理3.常见问题本篇文章参考文献如下&#xff1a; 面试题&#xff1a;如何保证消息不丢失&#xff1f;处理重复消息&#xff1f;消息有序性&#xff1f;消息堆积处理&#xff1f; (qq.com) 超详…