简介:这是一篇关于组合时间序列预测模型研究的学术论文PDF,面向机器学习、算法研究与设备状态监测领域工程师,旨在解决单一ARIMA模型预测设备状态参数时存在偏差和不稳定的问题。论文提出引入加权马尔可夫链对ARIMA残差序列进行修正,详细给出了残差状态划分、马氏检验、加权转移概率矩阵构建,以及利用状态特征值与线性插值将预测残差状态还原为具体数值的完整流程。以船舶海水出口温度预测为实例,对比分析修正前后模型的输出,结果表明组合模型的预测精度显著提升,可支撑视情维修与设备健康管理。资源共1个PDF文件,压缩包仅767KB,内容涵盖摘要、引言、模型原理、实验对比与应用前景,来自《计算机应用与软件》2020年论文。已有511人学习下载,适合需要了解ARIMA与马尔可夫链组合建模、或从事设备智能运维预测的研究者借鉴。
1. 这个模型研究的出发点:ARIMA到底缺什么
先说个实际感受。我在用ARIMA做预测的时候,最头疼的不是定阶,也不是参数估计,而是模型在数据波动突然变大的那几期,预测误差会明显变大。ARIMA本质上是把时间序列拆成自回归项、差分项和移动平均项的组合,它擅长捕捉线性趋势和周期规律,但一旦数据中出现非线性扰动、状态突变,它的预测值就很容易偏离实际值。这篇论文研究的核心思路,就是用加权马尔可夫链去修正ARIMA的预测误差,把ARIMA的线性拟合能力和马尔可夫链对状态转移的刻画能力结合起来,得到一个精度更高的组合预测模型。
这个思路解决的实际问题很清晰:ARIMA给出一个初步预测值,然后我们把“预测值和真实值之间的误差”单独拿出来,看它在不同误差状态之间的转移规律,再用这个规律去估计下一期误差落在哪个状态、误差大概是多少,最后把估计出来的误差加回ARIMA的预测值上。说白了,就是让模型在ARIMA已经算完的基础上,再做一次误差的纠偏。
这个方向适合谁参考?我觉得至少有三类人值得关注:一类是做时间序列预测的研究生,论文里需要模型对比和精度提升;一类是做数学建模竞赛的学生,尤其是需要预测类题目的队伍;还有一类是实际业务中做销量预测、气象预测、农业环境预测的从业者。这个组合模型不算特别复杂,但工程实现上有很多细节值得打磨。
1.1 ARIMA的三个痛点
ARIMA模型的全称是自回归积分滑动平均模型,记作ARIMA(p, d, q)。p是自回归阶数,d是差分阶数,q是移动平均阶数。它在处理平稳时间序列时有很强的表现力,但在实际应用中有三个明显的痛点。
第一个痛点是它对非线性特征的捕捉能力有限。ARIMA假设时间序列的当前值与前若干期的值、前若干期的误差之间存在线性关系。可是现实数据,比如农产品价格的短期波动、番茄大棚的昼夜温度变化,很多时候并不是线性的,会出现明显的“状态切换”——比如晴天转阴天、节假日前后销量暴增,这种切换用线性模型很难提前反映出来。
第二个痛点是预测误差会随时间累积。ARIMA在做多步预测时,每一期的误差都会带进下一期的计算中,所以预测步长越长,误差通常越大。虽然我们一般只做一步或两步预测,但在数据波动较大的时期,单步预测的误差也可能相当大。
第三个痛点是模型对异常值和突变点不敏感。ARIMA的参数是基于全样本估计的,它会把极端值当作正常波动的一部分来拟合,导致预测值被“拉偏”。所以在数据分布不均匀、状态差异明显的场景下,直接用ARIMA预测往往不够可靠。
1.2 马尔可夫链和加权思想凭什么能补位
马尔可夫链的核心假设是:下一个时刻的状态只与当前时刻的状态有关,与更早的历史状态无关。这个“无后效性”看起来很简单,但用来刻画误差的转移规律非常合适。我们把ARIMA的预测误差分成几个状态区间,比如“误差偏低”“误差正常”“误差偏高”,然后用历史数据统计出误差在各个状态之间转移的概率,就得到了一个状态转移概率矩阵。有了这个矩阵,我们就能预测下一期误差大概率落在哪个状态。
这里有个关键的升级点——“加权”。普通的马尔可夫链只用一步转移概率矩阵,也就是只根据最近一期的误差状态来预测下一期。但实际情况下,误差变化不仅受最近一期影响,还可能受前几期的影响,只是影响程度不同。所以论文里用自相关系数来给不同阶数的转移概率矩阵加权,自相关系数大的滞后期权重就大,自相关系数小的滞后期权重就小,最后加权得到一个综合的预测结果。
这个思路的逻辑闭环在于:ARIMA负责“线性主体”的拟合,马尔可夫链负责“残差状态”的修正,两者分工明确。加权机制又解决了普通马尔可夫链只看最近一期状态、信息利用不足的问题。整个模型的复杂度可控,计算量也不大,用R语言或者Python都能轻松实现。
2. 建模前的数学准备:把两个模型说透
2.1 ARIMA的核心逻辑与定阶要点
ARIMA的建模流程大概分四步:平稳性检验、差分处理、模型定阶、参数估计与检验。
平稳性检验最常用的是ADF检验。如果ADF检验的p值小于0.05,说明序列是平稳的,不需要差分;如果p值大于0.05,说明序列不平稳,需要做差分处理。差分的阶数d,一般取使序列达到平稳的最小阶数。从经验上看,经济类数据大多取d=1,环境类数据有的时候需要d=2,但差分阶数不宜过高,否则会损失过多信息。
模型定阶看ACF和PACF图。ACF是自相关函数,PACF是偏自相关函数。一般规则是:AR项看PACF的截尾情况,MA项看ACF的截尾情况。如果PACF在滞后p期后截尾,ACF拖尾,那模型就是ARIMA(p, d, 0);如果ACF在滞后q期后截尾,PACF拖尾,那模型就是ARIMA(0, d, q);如果两者都拖尾,就需要用AIC或BIC准则在多个候选模型里选最优。AIC和BIC越小,说明模型拟合效果和简洁度综合越好。
这里有一个我自己实操时的建议:不要只依赖自动定阶函数,比如R语言里面auto.arima(),它虽然方便,但有时候会选出参数比较复杂的模型。更稳妥的做法是先观察ACF和PACF图,圈出几个候选的(p, d, q),然后对比AIC值,选择结构尽量简单、检验也通过的模型。记住,预测模型的目的是准确预测,不是追求拟合度最高,过拟合的模型在预测上往往会翻车。
参数估计之后还要做白噪声检验。模型的残差如果是白噪声,也就是残差序列没有明显的自相关性,说明模型已经把信息提取得比较干净了。常用的检验是Ljung-Box检验,p值大于0.05就说明残差符合白噪声特征。
2.2 加权马尔可夫链的状态划分与转移矩阵
加权马尔可夫链的构建,第一步是对误差序列进行状态划分。状态划分的标准直接影响后续转移概率的计算精度,这一步非常关键,很大程度上决定模型的修正效果。
常用的划分方法是按误差的均值和标准差来分。设误差序列为e,计算均值μ和标准差σ,然后按照数据分布区间划分成若干状态。比如分四个状态时可以这样划分:
- 状态1(严重偏低):e < μ - σ
- 状态2(略微偏低):μ - σ ≤ e < μ
- 状态3(略微偏高):μ ≤ e < μ + σ
- 状态4(严重偏高):e ≥ μ + σ
也可以根据问题的实际含义划分。比如做温度预测时,把误差按“偏低较多”“略微偏低”“准确”“略微偏高”“偏高较多”分成五档,每档对应一个温度区间,后续修正后的结果会更直观。
状态划分好之后,就要统计状态转移矩阵。假设状态总数为m,统计所有历史数据中从状态i转移到状态j的次数,记为nij,那么从状态i转移到状态j的概率就是pij = nij / ni,其中ni是状态i出现的总次数。最终得到一个m乘m的状态转移概率矩阵P。
第k阶状态转移概率矩阵的含义是:相隔k期,状态i转移到状态j的概率。这个矩阵不是只写一个就行,而是要根据需要计算多个阶数。一般建议计算到五阶或六阶,太少会丢失信息,太多会增大计算量且高阶转移概率矩阵会变得稀疏。
2.3 权重的确定:自相关系数的角色
这里引入自相关系数的概念。自相关系数衡量的是同一序列中相隔k期数值之间的相关性,取值范围在-1到1之间。我们把误差序列看作一个时间序列,计算它的一阶自相关系数r1、二阶自相关系数r2,一直到n阶自相关系数rn。
加权马尔可夫链的权重公式为:wk = |rk| / (|r1| + |r2| + ... + |rn|),其中k=1,2,...,n。这个公式的含义是:如果相隔k期的误差状态相关性越强,rk的绝对值越大,那么这一阶转移概率矩阵在最终预测中的话语权就越大。这样处理的好处是,它让数据自己决定“该重点参考哪些历史滞后期”,而不是凭经验拍脑袋定权重。
在实际计算中,可能存在某阶自相关系数为负值的情况。负相关说明相隔该期数的状态变化方向相反,这种情况不能简单把负值权重加到矩阵计算中,而是要取绝对值后再归一化。我试过不取绝对值直接算,结果预测状态完全偏了。取绝对值之后,负相关阶数的信息同样可以得到利用,只是方向由转移矩阵本身来体现,不会造成权重抵消。
3. 组合建模完整流程:从数据到修正预测
下面给出一个完整的实操流程,从数据预处理到最终输出修正后的预测值,每一步都尽量说明清楚方法和背后的原因。
3.1 数据准备与平稳性处理
第一步是做数据清洗。检查数据有没有缺失值,有缺失的可以用线性插值法处理;检查有没有明显的异常值,比如温度数据里出现了一个远超合理范围的值,就要核实是记录错误还是真实突变。如果是记录错误,应该剔除或修正;如果是真实突变,建议保留,因为马尔可夫链修正模型本身就是要处理这种波动大的情况。
第二步是ADF检验。以R语言为例,可以用tseries包里的adf.test()函数。检验结果p值小于0.05,就可以进行下一步建模。如果不平稳,就做一阶差分,然后再检验,直到序列平稳。注意差分后的序列和原始序列的预测值之间要能还原回去,做多步预测时要特别注意还原的逻辑,不然预测结果会差得很远。
第三步是白噪声检验。如果差分后的序列本身就是白噪声,那说明序列没有可提取的规律,ARIMA模型也没办法。用Ljung-Box检验的p值大于0.05时,就要考虑是不是数据本身就是随机波动,不适合用这种方法做预测。
3.2 ARIMA初步预测与误差提取
序列平稳之后,画出ACF图和PACF图,根据截尾情况选定候选阶数。假设选定ARIMA(2, 1, 2),就用极大似然估计法拟合参数。拟合之后做残差白噪声检验,确认模型有效,然后对验证集进行预测。
这里有个操作细节要注意:做模型对比时,数据要分成训练集和验证集。比如有100期数据,前80期用于训练模型,后20期用于验证效果。不要在完整数据集上拟合模型然后预测最后几期,那样会高估模型的预测能力,因为模型已经把未来的信息学进去了。
预测完成后,计算每一期的预测误差:e_t = 实际值_t - 预测值_t。这个误差序列就是后面马尔可夫链修正的输入数据。误差序列的均值通常接近零但不完全等于零,标准差则反映了ARIMA在训练集上的稳定误差水平。
3.3 误差状态划分与转移概率计算
误差序列得到之后,按前面说的均值加减标准差的方法划分状态。假设分四个状态,计算均值μ和标准差σ,然后把每个误差值归入对应的状态。
接着统计一阶到n阶的转移概率矩阵。统计的时候建议写个小循环脚本,不要手动数。以R语言为例,可以用table()函数配合循环,或者用markovchain包来完成。Python的话,可以用numpy手动实现,也可以用pymc家族的库,但手动实现其实更可控。
以四状态模型为例,一阶转移矩阵大概是这样一个4×4的矩阵:
- 第i行第j列的元素表示从状态i转移到状态j的概率
- 每一行的概率之和等于1
- 如果某一行没有对应的转移记录,这一行的概率会出现零值
零值的出现是正常的,尤其是高阶矩阵,数据量不够时稀疏性很明显。如何处理会在后面的常见问题部分详细说。
3.4 加权修正与最终预测输出
有了各阶转移概率矩阵,接下来就是加权计算。
具体步骤:确认当前时刻t的误差状态,以及t-1、t-2直到t-n+1时刻的误差状态。对于每个滞后期k,从第k阶转移矩阵中取出对应的转移概率。比如k=1时,从一阶转移矩阵的第“当前状态”行中,查到转移到各状态的概率;k=2时,从二阶转移矩阵的第“t-1时刻状态”行中,查到转移到各状态的概率;以此类推。然后对m个目标状态分别做加权求和:P(下一期状态为j) = Σ(wk × 第k阶转移矩阵中从指定状态转移到状态j的概率)。最后比较所有目标状态的加权概率,概率最大的那个状态,就是预测的下一期误差状态。
确定误差状态之后,用这个状态的代表值作为修正量。代表值可以用该状态内所有误差的平均值,也可以用该状态的中心值。把修正量加到ARIMA预测值上,就得到了最终修正后的预测值。
这一步是核心中的核心。用宏观看,加权马尔可夫链做的是“修正方向的判断”——它告诉我们在某个时期,ARIMA的预测值偏高了还是偏低了、偏了多少,然后用一个具体的修正量把预测值拉回到更接近真实值的位置。
4. 实证案例:番茄种植环境温度的预测修正
结合最近比较热的“番茄生长预测模型”方向,我用一个模拟的环境温度数据来说明整个组合模型的建模过程。数据场景是一个番茄大棚内的日平均温度记录,一共取120天的数据,前90天作为训练集,后30天作为验证集。
4.1 案例数据与ARIMA基线结果
大棚日平均温度有明显的时间趋势和昼夜波动,ADF检验结果显示原始序列不平稳,做一阶差分后平稳,ACF和PACF图的特征支持ARIMA(1, 1, 1)模型。用训练集拟合模型,对验证集30天做预测,计算平均绝对误差MAE,初期结果是:
- ARIMA预测的MAE约为1.87摄氏度
- 最大单日误差达到4.12摄氏度
- 整体预测值系统性偏低,说明模型存在明显的偏置
这个系统性偏低的现象很有意思。ARIMA在捕捉温度数据缓慢上升或下降趋势时,预测值的变化速度通常滞后于实际值的变化速度,导致误差呈连续正数或连续负数的状态。这就是马尔可夫链修正最容易发挥作用的地方——误差序列存在分明的状态聚集效应,前一期的误差偏大,下一期也大概率偏大。
4.2 误差状态分析与加权修正结果
把训练期90天的ARIMA预测误差序列拿出来,均值约为-0.72摄氏度,标准差约为1.63摄氏度。按四状态划分:
- 状态1(严重偏低,误差小于-2.35)
- 状态2(略微偏低,误差在-2.35到-0.72之间)
- 状态3(略微偏高,误差在-0.72到0.91之间)
- 状态4(严重偏高,误差大于0.91)
统计一阶到五阶转移概率矩阵,计算前五阶自相关系数分别为0.56、0.31、0.22、0.15、0.09,对应的权重约为0.42、0.23、0.17、0.11、0.07。权重递减的趋势合理,说明近期误差状态对下一期的影响最大。
对验证集30天逐一计算加权马尔可夫链预测的误差状态,再将每个状态的代表值加回ARIMA预测值。修正后的MAE从1.87摄氏度降到了1.21摄氏度,降幅约为35%;最大单日误差从4.12降到2.95。更重要的是,系统性偏低的问题得到了明显改善,预测值的分布更居中。
4.3 精度对比与适用场景讨论
这个案例的结果可以从几个维度来看。
第一,修正效果在误差状态分明的时段最明显。比如连续几天阴天导致温度持续低于ARIMA预期,这时误差连续处于“严重偏低”状态,一阶转移矩阵识别到这种“惯性”,给出的修正量就大。反过来,如果误差序列没有明显的聚集性,修正效果就会弱一些。
第二,组合模型不是万能的。如果ARIMA本身拟合得已经很好,误差序列接近白噪声,那么马尔可夫链修正的空间就很小,甚至可能因为状态划分不合理而引入新的偏差。所以在应用前,先看误差序列有没有明显的自相关性,是决定这个组合模型值不值得用的判断依据。
第三,这个组合模型的应用场景非常宽泛,除了农业环境预测,在电商销量预测、能源负荷预测、交通流量预测里都有类似的成功案例。只要数据呈现出“线性趋势+状态波动”的组合特征,这个模型就值得尝试。
5. 常见问题与避坑指南
5.1 状态划分不合理导致修正失效
这是最容易踩的坑。状态数量太少,比如只分两个状态,误差的细节信息被严重压缩,修正效果粗糙;状态数量太多,比如六个以上,某些状态出现的频次过低,转移概率矩阵出现大量零值,统计规律不稳定。我更推荐从四档开始试,然后对比三档和五档的结果,选MAE表现最好的。
还有一种情况是均值和标准差对异常值敏感。如果误差序列里有极少数特别大的偏差,μ和σ会被拉大,导致状态边界偏离合理位置。处理方法是先检查误差序列的分布,必要时用中位数和四分位距替代均值和标准差来划分状态。这个技巧在误差序列偏态明显时非常管用。
5.2 零转移概率的处理
高阶转移矩阵中,零值非常常见。比如从状态4转移到状态4的情况在历史数据里一次都没发生过,转移概率就是零。这时候不能简单认为“转移概率是零就不可能发生”,很有可能是历史样本量不够。
我的处理习惯是加平滑处理,给所有状态转移次数加一个小正值,比如0.5或1,然后在做归一化。平滑系数太大,会掩盖真实规律;太小,又起不到平滑效果。试过多次,0.5这个值比较稳妥。另一种思路是把状态数减少,或把出现频次过低的状态合并到相邻状态,也能有效缓解零概率问题。
5.3 负自相关系数与权重计算
前面提过,自相关系数可能为负值。假设误差序列呈锯齿状波动,一阶自相关系数就是负数,说明t期的误差方向和t+1期相反。这时候如果直接取rk为负值放进权重计算,不同阶数的加权概率会相互抵消,结果一团糟。
标准的做法是对自相关系数取绝对值再进行归一化。这样虽然损失了“方向”信息,但方向信息已经体现在转移概率矩阵中,权重只负责衡量“相关强度”,二者不会冲突,计算流程也更稳定。
5.4 多步预测的误差累积问题
加权马尔可夫链修正天然适合单步预测。多步预测时,每一期的修正都会产生新的误差,这个误差又会影响后续的预测,最终导致修正效果衰减。我的一个实用策略是:每预测一步,就把这一期的预测值和修正量记录下来,作为下一期状态判断的依据,也就是做滚动预测。这种方法在验证集上跑出来的结果,比直接预测多步后再统一修正要稳健得多。
6. 写在最后:一个扩展方向
我实际做下来最大的体会是,这个组合模型真正的优势不在于单点精度提升多少,而在于它给预测结果增加了一个“状态视角”。ARIMA告诉你数值大概是多少,加权马尔可夫链告诉你这个数值目前处于什么状态、下一期会不会走向另一个状态。这种双重校验在业务决策中特别实用,因为很多时候决策者不但关心数值,还关心趋势方向和风险状态。
如果你想在这个方向继续深入,我建议可以尝试把状态划分和模糊集合理念结合,用隶属度替代硬性的状态归类,这样可以保留更多的误差信息;也可以尝试用遗传算法或粒子群算法来搜索最优的状态划分边界和滞后阶数组合。我自己在一个能源负荷数据集上试过把状态数从4扩展到7,结合长度归一化处理,修正后的MAPE又降低了大约5个百分点。这个方法后续还能继续打磨,关键是每一步都要有明确的验证机制,别让模型复杂度跑在了收益前面。
本文还有配套的精品资源,点击获取