Theta方法:一种时间序列分解与预测的简化方法

Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。

每个数据科学爱好者都知道,时间序列是按一定时间间隔收集或记录的一系列数据点。例如,每日温度或经济指标的月值。把时间序列想象成不同成分的组合,趋势(数据移动的一般方向),季节性(随时间重复的规律模式)和噪声(不能归因于趋势或季节性的随机波动)是时间序列预测的常用方法

什么是θ方法?

Theta方法核心思想是将时间序列数据分解为两个或多个子序列,然后对每个子序列分别应用简单的指数平滑技术。

Theta方法的关键在于其分解过程,它将原始时间序列通过一种特定的“Theta线”分解技术,把时间序列分解为趋势组件和随机波动组件。这种分解有助于更清晰地看到数据中的趋势和周期性变化,从而使预测更为准确。

在应用Theta方法时,通常会使用两条Theta线:一条用于捕捉序列的长期趋势(通常称为Theta(0)),另一条用于描述更短期的波动(Theta(2))。这两个组件经过适当的处理和组合,最终形成最终的预测模型

Theta方法修改时间序列以突出显示不同的组件。这是通过在原始序列中添加或减去趋势分量来完成的。例如,如果我们选择Theta值为2,则我们创建了一个趋势影响加倍的新系列。如果θ为0,则完全去除趋势,只关注周期性和不规则成分。

在对序列进行处理后,它受到基本预测技术的影响,如指数平滑,通过平滑短期波动来突出长期模式。Theta方法的优点在于其简便性和对数据不高的需求,使得它非常适合对于时间序列数据进行快速而有效的预测。此外这种方法在多个预测比赛中表现出色,证明了其有效性。

在Python中创建用于时间序列分析的Theta方法算法

如果你正在试图预测一家商店未来的销售额。你会注意到,这些年来销售额总体上是增长的(趋势),但每年12月的销售额也有一个高峰(季节性)。最重要的是,由于各种不可预测的因素(噪音),销售额会随机波动。

Theta方法可以帮助分离这些不同的影响,从而更容易理解潜在的模式。通过分别关注和预测每个组成部分,然后将这些预测结合起来,可以对未来的销售做出更可靠的预测。

下面我们在Python中创建一个非常简单的算法,它使用Theta方法来预测ISM PMI的未来值。

PMI是指美国供应管理协会(ISM)的采购经理人指数(PMI)。这是一个受到广泛关注的经济指标,可以洞察制造业和服务业的整体健康状况。

PMI指数高于50表明制造业或服务业正在扩张,而低于50则意味着收缩。

算法代码如下:

 importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromstatsmodels.tsa.holtwintersimportExponentialSmoothingdeftheta_decomposition(time_series, theta):trend=np.polyval(np.polyfit(np.arange(len(time_series)), time_series, 1), np.arange(len(time_series)))deseasonalized=time_series-trendtheta_series=deseasonalized+ (theta*trend)returntheta_series, trenddefforecast_theta(time_series, theta, forecast_horizon):# Decompose the time seriestheta_series, trend=theta_decomposition(time_series, theta)# Fit an Exponential Smoothing model on the theta seriesmodel=ExponentialSmoothing(theta_series, seasonal='add', seasonal_periods=12).fit()# Forecast the future valuesforecast_values=model.forecast(forecast_horizon)# Add the trend component back to the forecasted valuestrend_forecast=np.polyval(np.polyfit(np.arange(len(time_series)), time_series, 1), np.arange(len(time_series), len(time_series) +forecast_horizon))final_forecast=forecast_values+trend_forecastreturnfinal_forecastif__name__=="__main__":time_series=pd.read_excel('ISM_PMI.xlsx')time_series['Date'] =pd.to_datetime(time_series['Date'])time_series.set_index('Date', inplace=True)time_series=time_series['Value']# Set theta and forecast horizontheta=0forecast_horizon=12# Forecast future valuesforecast_values=forecast_theta(time_series, theta, forecast_horizon)# Plot the original series and the forecastplt.figure(figsize=(10, 6))plt.plot(time_series[-100:,], label='ISM PMI')plt.plot(pd.date_range(start=time_series.index[-1], periods=forecast_horizon+1, freq='M')[1:], forecast_values, label='Forecast', color='red')plt.title('Theta Method')plt.xlabel('Date')plt.ylabel('ISM PMI')plt.legend()plt.grid()plt.show()

这里我们选择在Theta方法中使用指数平滑算法。

下图显示了使用Theta方法对未来12个月ISM PMI的预测。

我们上面演示了简单的指数平滑算法,因为Theta方法包含了2个步骤:

1、分解时间序列;2、对不同的子序列应用适当的预测

所以这两种方法都可以使用不同的方法进行,我们下面做一个简单的总结:

分解时间序列

Theta方法的分解主要是通过处理时间序列的趋势和季节性组件来实现,其核心思想是将原始序列转化为更简单的子序列,然后对这些子序列进行预测。这种方法虽然在原始提出时没有特别复杂的分解方法,但它依赖于一种关键的转换,即“Theta线”。下面是几种常用于时间序列分解的方法,这些方法可以与Theta方法结合使用或作为其分解步骤的参考:

  1. 趋势和季节性分解:- 经典分解:将时间序列分解为趋势、季节性和随机成分。这种方法通常假设季节性和趋势成分的长度是固定的。- STL分解(季节性和趋势分解):这是一种更为灵活的分解方法,允许季节性组件随时间变化,适用于处理复杂的季节性模式。
  2. 指数平滑状态空间模型:- 单一指数平滑:用于没有趋势和季节性的数据。- 双重指数平滑:添加趋势成分的处理。- 三重指数平滑(Holt-Winters方法):同时处理趋势和季节性变化。
  3. 差分:- 季节性差分:用于减少数据中的季节性效应。- 一阶或高阶差分:用于使非平稳序列平稳化,通过消除趋势成分。
  4. Theta线:- Theta(0)和Theta(2)线:在原始的Theta方法中,时间序列通过调整二阶差分的系数来创建两条Theta线。Theta(0)通常适用于平滑处理,捕捉更长期的趋势;Theta(2)则强调更短期的波动。

通过这些分解技术,可以更好地理解和预测时间序列数据的动态。在实际应用中,选择哪种分解方法取决于数据的特点以及预测的具体需求。Theta方法的优点在于它通过一个相对简单的处理过程,将复杂的时间序列转换为更易于分析和预测的形式。

子序列预测

移动平均(MA)

这是一种简单的技术,通过计算时间序列中一定数量的最近数据点的平均值来进行预测。这种方法适用于平滑数据并预测短期趋势。

指数平滑(Exponential Smoothing)

单一指数平滑适用于没有明显趋势和季节性的数据;双重指数平滑用于有趋势无季节性的数据;三重指数平滑(Holt-Winters方法)适用于同时具有趋势和季节性的数据。

自回归模型(AR)

自回归模型是通过前几期的数据值来预测未来值,这种模型假设未来的值与历史值之间存在线性关系。

机器学习方法

线性回归、决策树和随机森林、深度学习的方法

总结

Theta方法是一种时间序列预测技术,因其操作简单和有效性而在许多应用场景中得到了广泛的使用。这种方法主要通过分解时间序列并应用简单的指数平滑来预测未来的值,特别是在处理具有明显趋势的数据时表现出色。它的主要优势在于易于实施和理解,对于非专业人士也较为友好,且由于其简洁性,Theta方法在计算成本上相当低,适合于大规模数据集的快速预测。

但是Theta方法也存在一些局限。首先,它在原始版本中并不直接处理季节性变化,这可能会限制其在处理季节性明显的时间序列数据时的适用性。此外,该方法对时间序列的趋势做了线性假设,这意味着它可能无法很好地处理趋势非线性或更复杂模式的数据。尽管Theta方法在多个预测比赛中表现优异,但它的理论基础相对薄弱,主要是基于经验的应用导向,这在某些统计严谨性要求较高的场合可能是一个缺点。

尽管Theta方法本身简单,但要达到最佳预测效果,选择合适的参数和组合策略是必需的,这有时需要依靠预测者的经验和实验。因此尽管Theta方法在许多情况下非常有用,但它也需要在特定的应用背景下进行适当的调整和优化。

https://avoid.overfit.cn/post/2aa300c36e934fe69435467c92b52c4d

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

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

相关文章

【linux/shell】shell中使用for循环读取数据

目录 一.for循环从列表中读取数据的几种形式 二.for循环从配置文件读取数据 三.for循环用通配符读取目录 四.for循环带有数字变量 一.for循环从列表中读取数据的几种形式 #!/bin/bash listl"aa bb cc" list2aa bb ccfor i in $list3 doecho $i done 使用这种形…

取证工作:怎样解锁 LUKS2 加密磁盘?

对于 LUKS2 密码进行恢复,Elcomsoft Distributed Password Recovery (简称 EDPR) 软件可以构建高性能集群,以更快地破解密码。EDPR 软件提供零开销的可扩展性,并支持 GPU 加速,以加快恢复速度。EDPR 可帮助…

Redis-实战篇-编码解决商铺查询的缓存穿透问题(缓存空对象)

文章目录 1、缓存穿透2、常见的解决方案有两种:2.1、缓存空对象2.2、布隆过滤器 3、编码解决商铺查询的缓存穿透问题3.1、queryById3.2、RedisConstants.java 1、缓存穿透 缓存击穿是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效…

Spring Boot中使用Feign进行HTTP请求

Spring Boot中使用Feign进行HTTP请求 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下如何在Spring Boot中使用Feign进行HTTP请求。 一、Fei…

【b站-湖科大教书匠】3 数据链路层-计算机网络微课堂

课程地址:【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 3 数据链路层 3.1 数据链路层概述 3.1.1 数据链路层在网络体系结…

2024华为数通HCIP-datacom最新题库(变题更新⑤)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 1、…

Python的with语句与上下文管理器:深入解析与实战应用

Python的with语句与上下文管理器:深入解析与实战应用 在Python编程中,with语句是一个强大的特性,它提供了一种简洁的方式来管理资源,如文件、网络连接等。通过使用with语句,我们可以确保在代码块执行完毕后&#xff0…

Python中的enumerate函数:索引与值的完美搭档

Python中的enumerate函数:索引与值的完美搭档 在Python编程中,遍历列表、元组或其他可迭代对象时,我们经常会需要同时访问每个元素的索引和值。这时,enumerate()函数就显得尤为重要,它为我们提供了一个简洁而高效的方…

【项目管理体系】代码评审规范

1完整性检查 2一致性检查 3正确性检查 4可预测性检查 5健壮性检查 6结构性检查 7可追溯性检查 8可理解性检查 9可验证性检查 软件开发全套资料获取:(本文末个人名片直接获取) 软件产品,特别是行业解决方案软件产品不同于一般的商品…

JavaScript中常用数据类型做布尔值(Boolean)转换

一、前言 二、示例 1、String转Boolean 2、Number转Boolean 3、NaN、Null、undefined 转Boolean 4、Object转Boolean 5、Array转Boolean 6、Symbol转Boolean 三、总结 四、思考 一、前言 JavaScript中,经常需要对一些值进行boolean判断,根据判…

DDoS攻击的最新防御策略:从检测到缓解的全方位方案

在数字化浪潮的推动下,互联网已成为现代社会的血脉。然而,随着网络空间的不断膨胀,分布式拒绝服务(DDoS)攻击如同潜伏在暗处的猛兽,随时准备发动致命一击,威胁着网络的稳定与安全。面对这一严峻…

前端-echarts tooltip展示多项自定义数据

效果如图,鼠标滑动到某一个柱子的时候,出现这一项数据的多个自定义数据,外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中,value就是实际展示的主数据,其他字段名为自定义的数…

【面试系列】Swift 高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

ArUco 相关(opencv)

主要的问题还是随着opencv的版本升级,对aruco模块的函数命名变化挺大的,因此需要正确调用opencv对应版本下的aruco相关函数,不然程序无法运行,会报各种异常 在线ArUco工具 https://chev.me/arucogen/ 保存下来的是svg格式 环境 …

Linux常见操作问题

1、登录刚创建的用户,无法操作。 注:etc/passwd文件是Linux操作系统中存储用户账户信息的文本文件,包含了系统中所有用户的基本信息,比如用户名、用户ID、用户组ID、用户家目录路径。 注:etc: 这个目录存放所有的系统…

Android关机闹钟的实现原理以及基于高通的实现

最近新到了一家公司, 做手机的rom, 刚来被分配做改造DeckClock这个部分以便熟悉整个代码环境.里面包含闹钟, 世界时钟, 定时器, 秒表四块. 我们是基于OnePlus的rom的基础上进行修改. 当我看到产品说关机闹钟相关的东西的时候, 因为之前懂一些关于RTC的东西, 就说这个是要基于RT…

Java工具包——Lombok

目录 1. maven仓库手动导入依赖注解 1.1 maven仓库引入依赖 1.2 在类上使用Data注解 1.3 在属性上使用Getter与Setter注解 2. EditStarters插件注解 2.1 安装EditStarters插件 2.2 在pom.xml中进行操作 2.3 在java对象类中使用注解 3. lombok工具使用结果查看 3.1…

腾讯云CVM,CentOS8系统下部署Java-Web项目步骤详解

在CVM中部署项目首先要配置好JDK,Tomcat,Mysql(这里以Tomcat和Mysql为例)。部署JDK和Tomcat的步骤可以参考 CentOS7系统下部署tomcat,浏览器访问localhost:8080/_不积跬步,无以至千里;不积小流,无以成江河。-CSDN博客 我这里从Mysql的安装和设…

HDOJ5616 Jam‘s balance

目录 HDOJ5616 Jams balance题目描述背景输入输出 题解解法一解法二优化 打赏 HDOJ5616 Jam’s balance 题目描述 背景 有 N N N个已知质量的砝码,分别询问给出的 M M M个质量能否被称出 输入 第一行输入一个变量 T T T,表示有 T T T组数据&#xf…

数据预处理功能教程,上传文件生成知识库 | Chatopera

如何快速的生成高质量的知识库? 数据预处理功能教程 | Chatopera 云服务低代码定制聊天机器人 关于 Chatopera Chatopera 云服务重新定义聊天机器人,https://bot.chatopera.com 定制智能客服、知识库、AI 助手、智慧家居等智能应用,释放创新…