首页 > 编程语言 >时间序列结构变化分析:Python实现时间序列变化点检测

时间序列结构变化分析:Python实现时间序列变化点检测

时间:2024-09-18 16:23:24浏览次数:12  
标签:方差 Python 检测 时间 序列 model 变化


平稳性是时间序列分析与预测的核心概念。在平稳条件下,时间序列的统计特性(如均值)在时间维度上保持不变,仅存在随机波动。

但是实际数据集中很少观察到完全的平稳性。时间序列通常会经历结构性断裂或变化。这些变化会引入非平稳性,从而改变时间序列的整体分布,这些标志着变化开始的时间点被称为变化点。

时间序列结构变化分析:Python实现时间序列变化点检测_方差

在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。因此需要采用最新数据更新模型或采取其他适当策略。对于历史数据中的变化点,可以通过特征工程方法(如干预分析)进行处理。

但需要注意的是,结构变化与异常值是两个不同的概念。异常值是指与时间序列的基本结构或分布所定义的正常行为显著偏离的观测值。而变化点则是指时间序列的整体结构发生转变,导致分布特性的改变。

接下来,我们首先详细探讨不同类型的结构变化。

结构变化的类型

结构变化可以分为多种类型。深入理解这些变化的性质对于选择适当的处理策略至关重要。

水平变化

水平变化主要体现在序列的均值或方差上。均值的变化表现为平均水平的移动,可以是永久性的,也可以是暂时性的。

永久性水平移动是指序列的平均值永久性地转移到一个新的水平。例如当一家零售企业开设新店时,销售时间序列可能会转移到一个更高的水平,反映出扩大的客户基础。

时间序列结构变化分析:Python实现时间序列变化点检测_时间序列_02

暂时性水平移动是指平均值在一段时间后恢复到原有水平。例如制造工厂的一台机器因维修而临时停机,生产时间序列在维修期间会出现暂时性的低值。一旦机器恢复运行,生产水平预计会回到正常状态。

时间序列结构变化分析:Python实现时间序列变化点检测_方差_03

方差变化

方差的变化会导致时间序列离散程度的增加或减少,具有非恒定方差的时间序列通常被称为异方差序列。方差的变化同样可以是永久性的或暂时性的。

时间序列结构变化分析:Python实现时间序列变化点检测_时间序列_04

方差的周期性变化是波动聚类现象的典型特征。波动聚类指的是时间序列呈现出低方差期和高方差期交替出现的模式。换言之,大(小)幅度变化往往会连续出现。

以下是表示每小时风速变化的时间序列示例,展示了波动聚类现象:

时间序列结构变化分析:Python实现时间序列变化点检测_时间序列_05

具有波动聚类特征的时间序列示例。

波动聚类在气象学(如风速分析)和金融学(如资产价格研究)等领域中较为常见。

基于Python的变化点检测代码实现

变化点检测算法旨在精确识别时间序列分布发生显著变化的时间点。本节将详细探讨多种变化点检测方法的实际应用。

我们从 datasetsforecast 库中加载一个示例时间序列数据:

fromdatasetsforecast.m4importM4  
 
 dataset, *_=M4.load('./data', 'Monthly')  
 
 series=dataset.query(f'unique_id=="M1430"').reset_index(drop=True)  
 series['time'] =pd.date_range(end='2023-12-01', periods=series.shape[0], freq='M')

此数据集是非常有名的销量预测比赛M4

利用kats进行变化点检测

kats是Meta开发的一个功能强大的时间序列分析库。它提供了多种变化检测方法,包括CUSUM(累积和)和贝叶斯在线变化点检测等。

kats要求使用特定的数据结构,可以按以下方式进行设置:

fromkats.constsimportTimeSeriesData  
 
 ts=TimeSeriesData(df=series[['time', 'y']])

CUSUM(累积和)是一种广泛应用于检测时间序列均值变化的方法。其原理是计算相对于预期值的偏差累积和。如果序列的均值保持稳定,累积和将呈现围绕零的随机波动。累积和的持续正向(或负向)变化则表明均值发生了上升(或下降)移动。

以下代码展示了如何使用kats中的CUSUM方法:

fromkats.tests.detectors.test_cusum_detectionimportCUSUMDetector  
 
 model=CUSUMDetector(ts)  
 change_points=model.detector(direction=['decrease', 'increase'])  
 model.plot(change_points)

detector方法的 direction 参数用于指定需要监测的变化方向。在本例中我们同时监测序列的上升和下降变化。

CUSUM方法实现了对变化点的准确检测:

时间序列结构变化分析:Python实现时间序列变化点检测_时间序列_06

另一种与CUSUM相似的方法是在移动平均的基础上计算z分数。kats中的 RobustStatDetector 就采用了这种方法:

fromkats.tests.detectors.test_robust_stat_detectionimportRobustStatDetector  
 
 model=RobustStatDetector(ts)  
 change_points=model.detector(p_value_cutoff=0.001, comparison_window=12)  
 model.plot(change_points)

在这个方法中,我们将p值阈值设置为0.001,窗口大小设置为12(对应于一年的数据,因为该序列是按月收集的)。

时间序列结构变化分析:Python实现时间序列变化点检测_人工智能_07

使用kats中的RobustStatDetector检测变化点。RobustStatDetector在这个例子中检测到了几个相互靠近的变化点。

利用ruptures进行变化点检测

ruptures库同样提供了多种变化点检测算法的实现,包括PELT(修剪精确线性时间)、基于核的算法和动态规划算法等。

以下是使用PELT算法检测均值变化的示例:

importrupturesasrpt  
 
 # 将时间序列转换为numpy数组  
 signal=series['y'].values  
 
 # 拟合PELT模型  
 model=rpt.Pelt(model="rbf").fit(signal)  
 
 # 获取变化点  
 result=model.predict(pen=10)

PELT算法的核心思想是将时间序列分割成具有不同统计特性(如均值)的多个片段。它通过最小化一个用户定义的成本函数来实现这一目标,该函数的具体形式取决于需要检测的变化类型。在这个例子中我们使用了基于径向基函数的模型(model=“rbf”)。

以下是PELT模型的检测结果:

时间序列结构变化分析:Python实现时间序列变化点检测_方差_08

变化点的处理策略

在识别出变化点后,下一步就是采取适当的处理措施。以下是几种常用的处理方法:

差分法

对时间序列进行差分是处理均值变化的一种有效方法。这种技术通过计算连续观测值之间的差值来稳定序列的平均水平。

以下是示例序列的一阶差分结果:

时间序列结构变化分析:Python实现时间序列变化点检测_人工智能_09

差分法能够有效消除许多类型的非平稳性,使得后续的分析和建模工作更加可靠。

虚拟变量法

另一种处理变化点的方法是引入虚拟变量。这种方法在变化点之前赋值为0,之后赋值为1,从而在模型中显式地表示结构变化。

时间序列结构变化分析:Python实现时间序列变化点检测_python_10

虚拟变量法允许模型捕捉变化前后的不同行为,提高了模型的灵活性和准确性。

区制转换模型

对于暂时性变化,区制转换模型(regime-switching)是一种较为复杂但有效的建模方法。这类模型能够根据当前的状态或区制采用不同的参数设置。

阈值自回归(TAR)模型是区制转换模型的一个典型例子。TAR模型对不同范围的时间序列值采用不同的参数,从而能够捕捉复杂的非线性动态。

总结结论

通过本文的分析,我们可以得出以下几点重要结论:

  1. 时间序列常常受到结构变化的影响,这些变化会显著改变序列的统计分布特性。
  2. 结构变化可能发生在均值或方差上,并且可能是永久性的或暂时性的。准确识别变化的性质对于选择适当的处理方法至关重要。
  3. 现代统计和机器学习提供了多种变化点检测方法,如CUSUM和PELT算法。这些方法在kats和ruptures等Python库中都有实现,为实践应用提供了便利。
  4. 对于检测到的变化点,可以采用多种处理策略。差分法和引入虚拟变量是处理均值变化的常用方法,而对于更复杂的情况,可以考虑使用区制转换模型。
  5. 数据预处理在处理结构变化中扮演着关键角色。合适的预处理不仅可以稳定序列的方差,还能为后续的建模工作奠定基础。

通过深入理解时间序列的结构变化,并灵活运用各种检测和处理方法,分析人员可以显著提高时间序列模型的准确性和可靠性,为决策提供更有力的支持。

作者:Vitor Cerqueira


标签:方差,Python,检测,时间,序列,model,变化
From: https://blog.51cto.com/deephub/12047113

相关文章

  • 3D高斯渲染 (1-3)ros下 接受c++节点发送的位姿,python节点渲染图像返回,同步版本
    基础学习3D高斯渲染(1-2)ros下接受c++节点发送的位姿,python节点渲染图像返回https://www.cnblogs.com/gooutlook/p/18385485ros自定义消息(图像+标志位+位姿)python和c++发布和接受https://www.cnblogs.com/gooutlook/p/18412553 本工程代码为什么要做这个,因为之前的版本......
  • 【Python基础】要想学好Python,学会函数是必不可少的。一篇文章带你了解Python函数!!!
    Python函数的详细讲解在Python中,函数是组织好的、可重复使用的代码块,用于执行特定的任务。函数可以接受输入参数,并返回结果。定义函数在Python中,使用def关键字来定义函数。函数的基本语法如下:deffunction_name(parameters):#函数体passfunction_name:函数的名......
  • Python 命令跳转微软应用商店问题解决办法
    最常见的解决办法就是在环境变量中将Python安装路径上移至  %USERPROFILE%\AppData\Local\Microsoft\WindowsApps 路径前。但是有时候这个办法也无法起效,那么此时可以进入系统设置中,将应用执行别名中的python项关闭。其路径在:应用>高级应用设置>应用执行别名 ......
  • ESP32使用microPython编程入门
    网络ESP32教程地址:https://www.itprojects.cn/coursecenter-hardware.html 一、Python+ESP32快速上手1.整体流程说明(EPS32-S3类似)2.下载&安装Thonny(EPS32-S3类似)3.下载MicroPython (EPS32-S3类似)不一样的地方有:3.1下载EPS32-S3的MicroPython固件,此处下载地址不一......
  • 如何使用 Python Matplotlib 绘制 3D 曲面图
    在数据可视化中,3D图表是一个非常有用的工具,特别是当想要展示复杂的三维数据时,如期权的波动率曲面。Python的matplotlib库提供了生成各种类型图表,包括3D图表。本文将介绍如何使用Python中的matplotlib绘制3D曲面图,适用于不同领域的数据可视化需求。准备工作安......
  • 20个Python入门基础语法要点
    今天,我们将聚焦于Python的20个基础语法要点,让你的编程之旅更加顺畅。第一部分:环境搭建与基本概念1.Hello,World!你的第一行代码:这是编程旅程的传统起点。这行代码告诉Python显示文本,print是关键函数,用于输出信息。2.变量与赋值存储信息的盒子:变量就像容器,用来......
  • 2024年JCR一区极光优化算法+分解对比!VMD-PLO-Transformer-BiLSTM多变量时间序列光伏功
    中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测目录中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料效果一览......
  • Python高手之路:揭秘列表的高级操作技巧
    引言列表的高级操作不仅能够提升代码的可读性和执行效率,还能让我们的程序更加灵活多变。无论是在日常开发还是数据分析任务中,掌握这些技巧都将使你如虎添翼。接下来,让我们从最基础的概念出发,一步步深入了解列表的高级操作吧!基础语法介绍首先,我们需要明确几个核心概念:列表推导......
  • Python字典:解锁数据处理的新维度
    引言在日常的软件开发过程中,我们常常遇到需要快速查找、更新或删除大量数据的需求。传统数组虽然使用广泛,但在某些场景下效率较低。此时,字典就展现了它无可比拟的优势——O(1)的时间复杂度让数据访问变得极为高效。更重要的是,通过灵活运用字典的高级特性,如嵌套字典、字典推导式等,......
  • Python 课程15-PyTorch
    前言PyTorch是一个开源的深度学习框架,由Facebook开发,广泛应用于学术研究和工业领域。与TensorFlow类似,PyTorch提供了强大的工具用于构建和训练深度学习模型。PyTorch的动态计算图和灵活的API使得它特别适合研究和实验。它还支持GPU加速,适用于构建复杂的神经网络。......