指数平滑算法介绍及代码实现

一、一阶指数平滑

  • 一阶指数平滑,也称为一次指数平滑或简单指数平滑(Simple Exponential Smoothing, SES),是时间序列预测中的一种方法。这种方法适用于没有明显趋势和季节性成分的时间序列数据。
  • 一阶指数平滑的基本思想是最近的观测值比远期的观测值在预测未来时更为重要。因此,这种方法给予近期的数据更高的权重,而远期数据的权重则按指数规律递减。
    一阶指数平滑的计算包括以下几个步骤:
  • 选择平滑系数(alpha):平滑系数决定了指数递减的速度,其值通常在0和1之间。alpha越接近1,模型对近期数据的关注越多;alpha越接近0,模型对历史数据的关注越多。
  • 初始化:对于数据序列的初始值,如果数据点较多(大于20个),可以取第一个数据点作为初始平滑值;如果数据点较少,可以取前几个数据点的平均值。
  • 平滑计算:一旦确定了alpha和初始值,就可以用以下公式进行平滑计算:
    预测值 = a * 实际值 + (1 - a) * 上一期的预测值
from visitOracle import visitOracle
import pandas as pd
import numpy as np
from math_tool import *
# 时间序列指数平滑算法###一阶指数平滑
## datas: 待预测的原始数据
## alfa: 平滑系数
## initial: 平滑初始值
## 返回结果:一次指数平滑结果
def expenontionSmooth(test_data , alfa , initial):expenontionResult = []expenontionResult.append(initial)for i in range(len(test_data) -1):# 指数平滑公式tempResult = alfa * test_data[i+1] + (1 - alfa) * expenontionResult[i] expenontionResult.append(round(tempResult , 2))return expenontionResult

二、二次平滑指数
当时间数列无明显的趋势变化,可用一次指数平滑预测。其预测公式为:

yt+1’=a*yt+(1-a)*yt’ 式中,

• yt+1’–t+1期的预测值,即本期(t期)的平滑值St ;

• yt–t期的实际值;

• yt’–t期的预测值,即上期的平滑值St-1 。
三、二次指数平滑预测

1) a为加权系数;

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

3) 在实际序列的线性变动部分,指数平滑值序列出现一定的滞后偏差的程度随着权系数(平滑系数)的增大而减少;但当时间序列的变动出现直线趋势时,用一次指数平滑法来进行预测仍将存在着明显的滞后偏差。因此,也需要进行修正。

4) 修正的方法也是在一次指数平滑的基础上再进行二次指数平滑,利用滞后偏差的规律找出曲线的发展方向和发展趋势,然后建立直线趋势预测模型,故称为二次指数平滑法。

在一次指数平滑的基础上得二次指数平滑 的计算公式为:

在这里插入图片描述

• 式中: St(2)——第t周期的二次指数平滑值;

• St(1)——第t周期的一次指数平滑值;

• St-1(2)——第t-1周期的二次指数平滑值;

• a ——加权系数(也称为平滑系数)。

二次指数平滑法是对一次指数平滑值作再一次指数平滑的方法。它不能单独地进行预测,必须与一次指数平滑法配合,建立预测的数学模型,然后运用数学模型确定预测值。
二次指数平滑法是对一次指数平滑值作再一次指数平滑的方法。它不能单独地进行预测,必须与一次指数平滑法配合,建立预测的数学模型,然后运用数学模型确定预测值。

二次指数平滑数学模型:
在这里插入图片描述
根据二次平滑指数数学模型进行计算a、b值。
python代码如下

###计算二阶指数平滑模型的参数
## datas: 待预测的原始数据
## alfa: 平滑系数
## initial: 平滑初始值
## 返回结果:二次指数平滑所对应的参数值
def paramCompute_TwoOrder(test_data, alfa,initial) :param0 = []     #param0: 存放各个时刻的截距param1 = []     #param1: 存放各个时刻的斜率## 得到一次指数平滑结果SmoothResult_oneOrder = expenontionSmooth(test_data , alfa , initial)## 得到二次指数平滑结果SmoothResult_twoOrder = expenontionSmooth(SmoothResult_oneOrder , alfa , SmoothResult_oneOrder[0] *1.1) for i in range(len(SmoothResult_oneOrder)):# 截距计算公式param0_temp = 2 * SmoothResult_oneOrder[i] - SmoothResult_twoOrder[i]# 斜率计算公式param1_temp =( alfa / (1- alfa ) ) * (SmoothResult_oneOrder[i] - SmoothResult_twoOrder[i]);param0.append(param0_temp)param1.append(param1_temp)params = {'param0':param0 , 'param1':param1}params = pd.DataFrame(params)return params
#######计算二阶指数平滑的预测结果
## datas: 待预测数据
## alfa: 平滑系数
## predictcnt: 预测期数
## initial: 平滑初始值
## return: 返回预测结果:数据的最后predictCnt为预测值
def predictValueOfTwoOrder(test_data, alfa,  predictCnt, initial):params_twoOrder = paramCompute_TwoOrder(test_data, alfa,initial)cnt = len(params_twoOrder) # 取最后一个时刻的截距param0 = params_twoOrder.iloc[cnt-1,]['param0']# 取最后时刻的斜率param1 = params_twoOrder.iloc[cnt-1,]['param1']predictValue = []     # 存放预测结果for i in range(cnt + predictCnt):tempValue = param0 + (i- len(test_data) + 1) * param1;predictValue.append(round(tempValue,2))return predictValue

四、三次指数平滑
若时间序列的变动呈现出二次曲线趋势,则需要采用三次指数平滑法进行预测。三次指数平滑是在二次指数平滑的基础上再进行一次平滑,其计算公式为:
在这里插入图片描述
三次指数平滑法的预测模型为:
在这里插入图片描述
python代码如下:

####计算三次指数平滑模型中3个参数
#### param datas        训练数据
#### param alfa         平滑参数
####return           返回结果三阶指数平滑的3个参数
def paramComputeOfThreeOrder(test_data, alfa, initial):param0 = []               # 存放参数a0param1 = []               # 存放参数a1param2 = []               # 存放参数a2# 得到一阶指数平滑结果SmoothResult_oneOrder = expenontionSmooth(test_data , alfa , initial);## 得到二次指数平滑结果SmoothResult_twoOrder = expenontionSmooth(SmoothResult_oneOrder , alfa , SmoothResult_oneOrder[0] *1.1) ## 得到三次指数平滑结果SmoothResult_threeOrder = expenontionSmooth(SmoothResult_twoOrder , alfa , SmoothResult_twoOrder[0] *1.1)for i in range(len(test_data)):param0_temp = 3 * SmoothResult_oneOrder[i] - 3 * SmoothResult_twoOrder[i] + SmoothResult_threeOrder[i]param1_temp = (alfa /(2 * (1 - alfa) * (1 - alfa))) *  ((6 - 5*alfa) * SmoothResult_oneOrder[i] - 2 * (5 - 4 * alfa) * SmoothResult_twoOrder[i] + (4 - 3 *alfa )* SmoothResult_threeOrder[i])param2_temp = (alfa * alfa / (2 * (1 - alfa) * (1 - alfa))) *(SmoothResult_oneOrder[i] -2 * SmoothResult_twoOrder[i] + SmoothResult_threeOrder[i]);param0.append(round(param0_temp,2))param1.append(round(param1_temp,2))param2.append(round(param2_temp,2))params = {'param0': param0 , 'param1':param1 , 'param2':param2}params = pd.DataFrame(params)return params
####  三次指数平滑模型预测结果
## datas: 待预测数据
## alfa: 平滑系数
## predictcnt: 预测期数
## initial: 平滑初始值   
## 返回预测结果    
def predictValueOfThreeOrder( test_data,  alfa,  predictCnt, initial):params_threeOrder = paramComputeOfThreeOrder(test_data, alfa, initial)cnt = len(params_threeOrder)# 取最后一个时刻的aparam0 = params_threeOrder.iloc[cnt-1,]['param0']# 取最后时刻的bparam1 = params_threeOrder.iloc[cnt-1,]['param1']# 取最后时刻的cparam2 = params_threeOrder.iloc[cnt-1,]['param2']predictValue = []     # 存放预测结果for i in range(cnt + predictCnt):tempValue = param0 + (i- len(test_data) + 1) * param1 + (i- len(test_data) + 1) * (i- len(test_data) + 1) * param2predictValue.append(round(tempValue,2)) return predictValue

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

指数平滑法的缺点:
• (1)对数据的转折点缺乏鉴别能力,但这一点可通过调查预测法或专家预测法加以弥补。

• (2)长期预测的效果较差,故多用于短期预测。

指数平滑法的优点:

• (1)对不同时间的数据的非等权处理较符合实际情况。

• (2)实用中仅需选择一个模型参数a 即可进行预测,简便易行。

• (3)具有适应性,也就是说预测模型能自动识别数据模式的变化而加以调整。
六、自动选择最后的平滑参数及相应的平滑阶数

## 系统选择最好的平滑系数和平滑初始值
## datas: 待预测数据
## predictCnt : 预测期数
## 返回结果: 相对误差最小的一组预测结果    
def  selectSmoothMethod(test_data , predictCnt):alfaLst = []alfaCnt = 20     # 由于alfa在0~1之间取值,每隔1/alfaCnt 采样一次,采集alfaCnt - 1次alfaStep = 1 / alfaCntfor i in range(alfaCnt - 1):alfaLst.append(round(alfaStep*(i+1) , 2))##在原始数据第一个值的(datas[0])* (1 - 20%) ~ (datas[0] * (1 + 20%))之间以步长( end - start ) / 100 为步长进行遍历    start_initial = test_data[0] * (1 - 0.2)end_initial = test_data[0] * (1 + 0.2)# 采样次数initialCnt =  100;  # 采样的步长        initialStep = (end_initial - start_initial ) / initialCntinitialLst = []for i in range(initialCnt):initialLst.append(round(start_initial + i * initialStep ,2))#### 存放二阶预测的相对误差relativeErrorOfTwoOrder = np.zeros((alfaCnt -1 , initialCnt) , dtype = np.double)### 存放三阶预测的相对误差relativeErrorOfThreeOrder = np.zeros((alfaCnt - 1, initialCnt) , dtype = np.double)for i in range(alfaCnt -1):for j in range(initialCnt):## 二阶指数平滑的预测结果## 此时resultOfTwoOrder的值为当 alfa = arrayAlfa[i] , initial = initialArray[j]的值## 遍历所有可能的alfa和initial,得到预测结果,计算每个结果的相对误差。## 得到二次指数平滑结果predictResult_twoOrder = predictValueOfTwoOrder(test_data, alfaLst[i],  predictCnt, initialLst[j]) ## 得到三次指数平滑结果predictResult_threeOrder = predictValueOfThreeOrder(test_data, alfaLst[i],  predictCnt, initialLst[j]) ### 计算平滑系数等于alfaLst[i] , 平滑初始值 =  initialLst[j]时,预测结果和原始数据之间的相对误差relativeErrorOfTwoOrder[i][j] =  cal_relativeError(test_data, predictResult_twoOrder)relativeErrorOfThreeOrder[i][j] = cal_relativeError(test_data, predictResult_threeOrder)## 取得二阶预测的相对误差最小值## 取得三阶预测的相对误差最小的值minest_error_twoOrder =round( find_martrix_min_value(relativeErrorOfTwoOrder) ,5)minest_error_threeOrder =round( find_martrix_min_value(relativeErrorOfThreeOrder) , 5)## 在二阶、三阶中找出最小的误差bestPredictResult = []minest_error = min([minest_error_twoOrder, minest_error_threeOrder])for i in range(alfaCnt -1):for j in range(initialCnt):if (minest_error == round( relativeErrorOfTwoOrder[i][j] ,5)):bestPredictResult=(predictValueOfTwoOrder(test_data, alfaLst[i],  predictCnt, initialLst[j]))if(minest_error ==round( relativeErrorOfThreeOrder[i][j] ,5)) :bestPredictResult=(predictValueOfThreeOrder(test_data, alfaLst[i],  predictCnt, initialLst[j]))return bestPredictResult    

参考博客:https://blog.csdn.net/hqr20627/article/details/79407867

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

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

相关文章

UUPSUpgradeable部署合约和升级合约

文章目录 写一个合约1. 使用代理部署 并添加拥有者2. 没有name number为103. 使用代理升级部署 填写上面代理的合约地址4. 合约地址没有变,但是添加了name,并且保存了number的属性值 写一个合约 // SPDX-License-Identifier: MIT // Compatible with Op…

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》【大模型思维链】

目录 前言一、思维链介绍1-1、指令1-2、逻辑依据1-3、示例 二、Cot一般分类2-1、Zero-Shot-CoT2-2、Few-Shot-CoT 三、Cot的好处&缺陷&适用3-1、Cot的好处3-2、Cot的缺陷3-3、Cot的适用 四、变体4-1、自我验证(self-consistency checking) 总结 …

freemarker实现代码生成器

这个主要是黑马的ihrm课程中讲的代码生成器的部分内容。 文章目录 应用场景第一个FreeMarker程序(数据模板 文件输出) 概述数据模型模板的常用标签模板的常用指令 元数据数据库元数据参数元数据结果集元数据 代码生成器思路分析搭建环境导入坐标配置实体…

CloudCompare——体元法计算树冠体积

目录 1.概述2.软件实现3.完整操作4.相关代码 本文由CSDN点云侠原创,CloudCompare——体元法计算树冠体积,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 1.概述 体元法将树冠所在的空间范围划…

python--4函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、递归练习

学习目标: 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 学习内容: 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 …

电弧的产生机理

目录: 1、起弧机理 2、电弧特点 3、电弧放电特点 4、实际意义 1)电力开关装置 2)保险丝 1、起弧机理 电弧的本质是一种气体放电现象,可以理解为绝缘情况下产生的高强度瞬时电流。起弧效果如下图所示: 在电场的…

SpringBoot整合Nacos

文章目录 nacosnacos下载nacos启动nacos相关配置demo-dev.yamldemo-test.yamluser.yaml 代码pom.xmlUserConfigBeanAutoRefreshConfigExampleValueAnnotationExampleDemoApplicationbootstrap.yml测试结果补充.刷新静态配置 nacos nacos下载 下载地址 一键傻瓜试安装即可,官…

【Linux】地址空间虚拟地址

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 虚拟地址1.1 虚拟地址引入1.2 虚拟地址理解1.3 虚拟地址细节问题 2. 地址空间2.1 理解地址空间2.2 页表和写时拷贝 3. 进程调度 1. 虚拟地址 1.1 虚拟地址引入 先先来一个测试代码&#xff1a; 1 #include<st…

微信小程序之点击事件

微信小程序中常用的点击事件主要是 tap&#xff0c;但除此之外还有其他的触摸类事件&#xff0c;用于不同的交互场景。以下是一些常见的点击和触摸相关的事件及其区别&#xff1a; 1、tap——最基本的点击事件&#xff0c;适用于一般的轻触交互&#xff0c;类似于 HTML 中的 c…

Octopus+: An RDMA-Enabled Distributed Persistent Memory File System——泛读笔记

TOS 2021 Paper 分布式元数据论文阅读笔记整理 问题 非易失性存储器&#xff08;NVM&#xff09;和远程直接存储器访问&#xff08;RDMA&#xff09;在存储和网络硬件中提供了极高的性能。然而&#xff0c;现有的分布式文件系统隔离了文件系统和网络层&#xff0c;而且分层的…

Nextjs学习入门 - 创建第一个项目

1 通过npx创建一个nextjs项目 通过命令创建&#xff1a; npx create-next-applatest 得到如下项目结构图&#xff1a; my-app- src //源代码目录- app //引用目录- favicon.ico //网站图标- globals.css //全局css- layout.tsx //布局文件- page.tsx //页面 路径"…

Scikit-Learn 支持向量机分类

Scikit-Learn 支持向量机分类 1、支持向量机&#xff08;SVM&#xff09;1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数 1、支持向量机&#xff08;SVM&#xff09; 1.1、SVM概述 在机器学习中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#x…

华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎受邀为PMO大会演讲嘉宾

全国PMO专业人士年度盛会 华为服务Fellow、首席项目管理专家&#xff0c;华为H5M项目管理标准制定主导者孙虎先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“落地项目管理标准&#xff0c;打赢班长的战争”。大会将于5月25-26日在北京举办&am…

国民经济行业导入数据库码表

目录 1、先去下载word文档图片如下 2、粘贴到excel中形成insert 语句 3、创建临时表存excel中数据 4、创建码表保存信息 5、编写存储过程放入表中 5.1存储第四级码值及父机构 5.2存储第三级码值及父机构 5.3存储第二级码值及父机构 5.4存储第一级码值 6、导入成功查看…

react 使用WEB3.0控件开发包 V3.0接入海康威视摄像头

1、下载官方安装包&#xff1a; 2、安装官方插件 3、引入文件 在public/index 中引入监控依赖&#xff0c;这三个文件可以在下载的官方demo中找到 4、react 中使用 useEffect(() > { const ipInfo :[192.168.xxxx];//初始化摄像头const WebVideoCtrl window.WebVideoCtrl…

Linux下kafka单机版搭建

1.zookeeper的安装 这里使用3.6.4版本 前提&#xff1a;服务器已经安装了jdk&#xff0c;zookeeper运行需要jdk环境 1.1创建放zookeeper的目录 #创建目录 mkdir -p /usr/local/zookeeper#赋予权限 chmod 777 /usr/local/zookeeper1.2安装包的下载 #这里推荐去官网下载 https:…

泛型的初步认识(1)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

Java 算法篇-深入了解 BF 与 KMP 算法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 BF 算法概述 1.1 BF 算法实际使用 2.0 KMP 算法概述 2.1 KMP 算法实际使用 2.2 相比于 BF 算法实现&#xff0c;KMP 算法的重要思想 2.3 为什么要这样设计&#x…

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间&#xff0c;节省…

华为云服务镜像手动更换

操作步骤&#xff1a; 1、进入华为云首页点击云容器引擎CCE&#xff1b; 2、选择你所要更换镜像的环境【这里以dev环境演示】&#xff1b; 3、点击dev环境后选择顶部的命名空间&#xff0c;点击【工作负载】中右侧栏的【升级】按钮&#xff1b; 4、点【更换镜像】选择你在test…