news 2026/10/26 8:00:59

MATLAB ARMA模型实战:网络流量占比时间序列预测与定阶指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB ARMA模型实战:网络流量占比时间序列预测与定阶指南

简介:ARMA.rar压缩包提供了一套基于MATLAB的ARMA时间序列预测实现,面向需要进行数据预测算法学习或应用的研究者与工程师。资源围绕ARMA模型的数据预处理、模型识别、参数估计、诊断与预测流程展开,帮助用户将自回归滑动平均理论落地到具体数据集上。包体内共12个文件,以10个txt数据文件为主,涵盖tcp、udp、icmp等协议的字节占比与包占比等网络流量指标,配有一个armaarma.m主程序脚本和一份xls数据表,便于直接运行和对照分析。压缩包容量仅322KB,轻量易获取;当前已有227人学习使用。通过该资源,可掌握在MATLAB中利用arima/forecast等函数构建ARMA模型并进行未来值预测的操作路径,同时理解差分平稳化、ACF/PACF定阶和残差诊断等关键环节,适合希望结合真实数据快速上手时间序列预测的读者。

1. 这套 ARMA 压缩包解决什么:从一个流量占比序列聊到数据预测算法

这套 ARMA.rar 不是一份只有公式的 PPT,而是能直接落地的 MATLAB 数据预测算法工程包。压缩包里的核心是 armaarma.m 主脚本,配合一批按协议粒度切分好的真实观测序列——TCP、UDP、ICMP、Others 的字节占比和包占比文本,外加 inputsize、outputsize 两个总量文件和 abc.xls 原始数据表。也就是说,数据是真实采集的,脚本是围着数据写的,解压后顺着脚本走一遍,就能看到 ARMA 从数据读取、平稳性检查、定阶、参数估计到预测的全链路。适合三类人:做时间序列课程设计的在校生、想快速验证 ARMA 预测效果的入门工程师、以及需要把流量特征序列做成预测 demo 的研究者。拿到压缩包先别急着改参数,按我下面拆的顺序把文件和命令跑一遍,你能很快建立这个工程的全貌。

2. 解包看数据:ratio 序列的构成与装入 MATLAB 的预处理

先用解压软件打开 ARMA.rar,把里面的 txt 文件当成一组时间序列来看。你会发现所有文件名都是「协议 + 指标 + ratio.txt」的结构,比如 tcpbytesratio.txt、udppacketratio.txt,这组文件刚好覆盖了网络流量的主要观测维度。我一般会先把文件按语义分组,再决定建模时用哪一列数据、哪一列数据是辅助信息。不要一上来就把所有 txt 塞进一个矩阵,那样到后面做预测时,你根本分不清自己在预测什么。

2.1 压缩包里的文件语义:从文件名反推数据组织方式

这份资源里的文件不是随便命名的,我把它分成四组,建模时的角色完全不同。

表格如下:

文件前缀数据含义取值范围在预测流程里的角色
tcpbytesratio.txt / tcppacketratio.txtTCP 协议的字节占比、包占比0~1 或 0~100主要的建模预测对象
udpbytesratio.txt / udppacketratio.txtUDP 协议字节占比、包占比同上可单独建模,也可做多序列对比
icmpbytesratio.txt / icmppacketratio.txtICMP 协议字节占比、包占比同上辅助分析,通常噪声较大
othersbytesratio.txt / otherspacketratio.txt其他协议字节占比、包占比同上兜底序列,常与主序列互补
inputsize.txt / outputsize.txt输入输出总量非负整数用于把占比还原成真实流量值
abc.xls原始观测汇总表视表结构而定数据整理源头
armaarma.mMATLAB 主程序-数据加载、建模、预测的完整流程

从命名看,ratio 类文件是按时间顺序排列的观测值,每个值代表该时刻某协议字节数或包数占总量的比例。inputsize 和 outputsize 是总量辅助列,当你需要把预测的占比再乘回真实流量大小时会用到。这种「占比序列 + 总量序列」的组织方式,在流量预测实验里很常见,占比较稳定、适合做平稳化处理,总量则波动大、更适合单独建模。

2.2 读入脚本:readmatrix 与文本文件的容错处理

MATLAB 读 txt 最省事的方式是 readmatrix,它自己会处理表头、空行和分隔符。不过 ratio 文件常常是单列文本,打开后也可能因为末尾空行产生 NaN,加载后先做一次清洗是必要的。

% 统一读入一个 ratio 序列,文件是一列数值,每行一个时间点 rawTcp = readmatrix('tcpbytesratio.txt'); rawTcp = rawTcp(:); % 强制转成列向量,避免后续维度搞混 rawTcp(isnan(rawTcp)) = []; % 文本头或空行产生的 NaN 直接丢弃 % 总量文件同样读入,后面做还原时备用 inSize = readmatrix('inputsize.txt'); outSize = readmatrix('outputsize.txt');

readmatrix 默认会跳过非数值单元格,所以即使某个 txt 文件里混进去一行说明文字,也不会让整个读取失败。rawTcp(:) 这一步很关键,因为 readmatrix 对单列文件有时会返回行向量,而 arima 类函数对输入维度有要求,行向量虽然能跑,但你在拼接训练集和测试集时很容易出错。inSize 和 outSize 读出来可能是多行多列,建议也统一做一次 reshape,或者先确认它是单列,再去和 ratio 序列对应。

这里还有一个量纲细节要提前判断。ratio 文件如果是 0~1 的小数,说明已经是占比;如果是 0~100 的数字,说明是百分比。建模时用哪种都能跑,但 Constant 项和预测值的解释会不一样。我的习惯是读入后先 max(abs(rawTcp)) 看一眼,超过 1 就统一除以 100,后面所有序列共用同一套量纲。

2.3 先过平稳性:adftest 与差分次数 d 的选定

ARMA 模型对平稳性有要求,平稳序列的均值、方差不能随时间漂移。流量占比序列多数时候相对平稳,但某些时段可能整体抬升或下降,不差分直接建模,预测往往偏向序列末端水平。我一般会用两套检验一起看,而不是只信一个函数。

% 平稳性:ADF 原假设是“存在单位根”,H=1 表示拒绝原假设,序列平稳 [hADF, pADF] = adftest(rawTcp); % KPSS 原假设是“序列平稳”,H=0 表示接受原假设,序列平稳 [hKPSS, pKPSS] = kpsstest(rawTcp); % 双测试结论一致才继续;结论不一致时优先做一阶差分再看 if ~hADF || ~hKPSS d = 1; data = diff(rawTcp); else d = 0; data = rawTcp; end

这里 hADF 等于 1 表示拒绝单位根原假设,说明序列平稳;hKPSS 等于 0 表示接受平稳原假设。两套检验的逻辑相反,结论一致时可信度更高。如果不一致,保守做法是先做一阶差分。注意 diff 会让序列少一个观测值,后面用 forecast 时 Y0 的长度要按差分后的序列长度来传,否则会报错。d 的值后续要传给 arima 函数的 'D' 参数,也就是 ARIMA(p,d,q) 里的 d,先在这里定下来,后面定阶就不用反复改了。

3. 定阶这一步最重要:ACF/PACF 看图、AIC 数值兜底

ARMA 建模最难的一步不是估计参数,而是确定 p 和 q。阶数定低了,残差里还有自相关;阶数定高了,参数冗余、估计结果不稳。我拿到任何一条序列,第一件事都是画 ACF 和 PACF 图,再用信息准则做数值兜底。两者结合,比单靠任何一个都稳。

3.1 从公式到 MATLAB 参数:AR、MA 与阶数 p、q 的对应关系

先把模型公式和 MATLAB 参数对应起来。AR(p) 模型表示当前值是过去 p 个观测值的线性组合,写成普通公式就是:

y_t = c + φ₁ y_{t-1} + φ₂ y_{t-2} + ... + φ_p y_{t-p} + ε_t

MA(q) 模型表示当前值是过去 q 期随机误差的线性组合:

y_t = c + ε_t + θ₁ ε_{t-1} + θ₂ ε_{t-2} + ... + θ_q ε_{t-q}

ARMA(p,q) 就是把两个公式合并,既包含自回归项,也包含滑动平均项。如果在建模前先做了差分,就变成 ARIMA(p,d,q)。在 MATLAB 里,arima 函数的经典调用是 arima(p, d, q),三个位置参数分别对应公式里的 p、d、q。这个映射关系看起来简单,但很多人会在 arima 函数的参数顺序上翻车,把第二个参数当成 q,导致模型完全不是自己想要的。

3.2 ACF/PACF 看图:判断拖尾、截尾的落点

自相关函数 ACF 描述序列和自身滞后项的相关性,偏自相关函数 PACF 描述剔除中间滞后影响后,某个滞后阶的净相关性。定阶口诀是:PACF 在 p 阶后截尾,选 AR(p);ACF 在 q 阶后截尾,选 MA(q);两边都拖尾,就选 ARMA。

figure; autocorr(data, 'NumLags', 20) % 看 ACF 是快速衰减还是拖尾 figure; parcorr(data, 'NumLags', 20) % 看 PACF 在哪一阶之后截尾

实际看流量占比序列时,ACF 通常衰减较慢,说明存在较强的自回归结构;PACF 可能在二阶或三阶后明显截尾。我见过很多人把 ACF 衰减慢直接判定为「不平稳」,其实这只是 AR 效应强,不一定需要差分,要结合第 2 章的 adftest 结论一起下判断。如果 ACF 呈正弦波形衰减,那才更像差分不够、趋势没去掉。

3.3 AIC 最小定阶:循环网格搜索

看图定阶有主观成分,尤其是两条尾巴都拖尾时,很难一次看清。我的做法是再跑一个 AIC 网格搜索,让数值说话。

orders = 0:3; aicMtx = nan(4, 4); logLMtx = nan(4, 4); for p = orders for q = orders Mdl = arima(p, 0, d); % 注意第三个位置参数是差分阶数 d try [~, ~, logL] = estimate(Mdl, data, 'Display', 'off'); % aicbic 输入:对数似然值、参数个数;+1 是常数项 aicMtx(p+1, q+1) = aicbic(logL, p+q+1); catch aicMtx(p+1, q+1) = inf; % 估计失败的组合直接淘汰 end end end [bestP, bestQ] = find(aicMtx == min(aicMtx(:)));

这段代码里 arima(p, 0, d) 的第二个 0 是差分前的 ARMA 中间参数位,实际上是「没有额外中间参数」的意思,真正起作用的是 p、d、q 三个位置数字的组合。参数个数 p+q+1 里的 +1 是常数项,如果你在 arima 里设置了 'Constant', 0,那参数个数就改成 p+q。小样本时 AIC 容易过拟合,可以用 aicbic 的变体 AICc,但这里不做展开,先用 AIC 把候选阶数圈出来,再回 3.2 的图里验证合理性。

4. 在 MATLAB 里跑通 ARMA 预测:armaarma.m 的关键流程拆解

armaarma.m 这个主程序,本质上是把第 2 章的数据预处理、第 3 章的定阶逻辑串成一条完整流程。我自己写这类脚本时会分成四个块:数据切分、模型定义、参数估计、预测与画图。下面按这个顺序拆开讲,每段代码都能独立跑。

4.1 训练/测试切分与序列标准化

时间序列预测里,测试集不能随机抽样,只能取序列最后一段。我的习惯是留最后 24 个点当测试集,因为比例序列通常按小时采样,24 对应一天,这个步长足够看出预测是否有效。

testLen = 24; % 预留 24 个点做测试 train = data(1:end-testLen); test = data(end-testLen+1:end); % 如果数值波动跨好几个量级,先做 Z-score 标准化再建模 mu = mean(train); sd = std(train); trainN = (train - mu) / sd; testN = (test - mu) / sd;

标准化这步不是必须的,arima 函数能处理原始量级的数据。但当 train 的均值和方差非常大,或者序列波动剧烈时,estimate 的数值优化过程容易收敛慢,甚至报「无法在最大迭代次数内收敛」。标准化后模型估计更稳,代价是预测结果要再做一次还原,也就是预测值乘 sd 加 mu。注意 mu 和 sd 只能从训练集算,如果把测试集也算进去,就造成了数据泄漏,预测误差会虚低。

4.2 用 arima 估计参数:模型定义与残差诊断

假设第 3 章选出来的最优阶数是 p=2、q=1,差分阶数 d=0,模型定义和估计代码如下。

pBest = 2; qBest = 1; dBest = 0; Mdl = arima('ARLags', 1:pBest, 'MALags', 1:qBest, 'D', dBest, 'Constant', 0); EstMdl = estimate(Mdl, trainN); % 取回估计出的 AR、MA 系数 arCoefs = cell2mat(EstMdl.AR); maCoefs = cell2mat(EstMdl.MA); % 用 infer 得到训练集残差,检查是否还残留自相关 res = infer(EstMdl, trainN); figure; autocorr(res, 'NumLags', 15);

arima 函数里的 'ARLags' 和 'MALags' 指定非连续的滞后阶数,比如 ARLags 为 [1 3] 表示只估计滞后 1 和滞后 3 的系数,其他滞后固定为 0。这里从 1:pBest 生成连续阶数,代码简洁。'Constant', 0 表示不让模型估计常数项,因为 trainN 已经是零均值标准化序列,强行估计常数反而多一个冗余参数。如果确实需要常数项,去掉这一行即可。

残差诊断是很多人会跳过的步骤。如果残差序列的 ACF 图里还有明显超过虚线置信区间的杆,说明 ARMA 没有把数据里的线性结构提取干净,需要回到第 3 章重新定阶。另外还要看残差是否有明显的尖峰或厚尾,这关系到后面预测置信区间是否可信。

4.3 forecast 的步长、Y0 与置信区间

预测是最后一步,也是最容易出错的一步。forecast 函数的基本用法是 forecast(EstMdl, numPeriods, 'Y0', trainN),第三个参数 Y0 必须传训练集的完整序列,不能只传最后几个点。

[fcstN, fcstSE] = forecast(EstMdl, testLen, 'Y0', trainN); fcst = fcstN * sd + mu; % 还原标准化 upper = fcst + 1.96 * fcstSE; lower = fcst - 1.96 * fcstSE; figure; plot(1:testLen, testN, 'k-o'); hold on; plot(1:testLen, fcstN, 'r--', 'LineWidth', 1.5); plot(1:testLen, upper, 'b:'); plot(1:testLen, lower, 'b:'); legend('真实值', '预测值', '95%上界', '95%下界');

Y0 的坑在于,它不只是提供初始状态,还要参与预测递推。如果你只给 Y0 传了训练集最后 3 个点,那前几步预测还能用这 3 个点递推,但从第 4 步开始就会拿预测值自己递推,累计误差会被低估。我习惯把整个训练序列都传进去,让 forecast 内部自行取需要的滞后值。fcstSE 是预测标准误差,乘 1.96 得到 95% 近似置信区间。随着预测步长增大,置信区间会越来越宽,这是模型对远期不确定性加大的客观反映,不是代码写错了。

5. ARMA 建模避坑:五个高频翻车点与排查方法

流量数据建 ARMA,最常见的坑不在理论,而在 MATLAB 函数的具体行为。下面五条都是我实际跑这类工程时踩过的,按「现象 → 原因 → 解决」写,你可以直接对照排查。

5.1 现象:forecast 报错「Y0 的长度必须至少包含某些滞后项」

这条报错很直接,但我第一次见时还是懵了一下。原因是我只给 Y0 传了训练集最后 5 个点,而模型的 ARLags 到了 2、差分阶数 d 为 1,加上 MA 项的滞后,需要更长的一段预采样数据才能开始递推。解决方式是直接把完整训练序列传给 Y0。如果数据量特别大,可以只取最近一段,但长度必须大于等于 max(p, d + q) 加上必要的预热期。与其纠结至少多少,不如全传,省心。

5.2 现象:预测 20 步以后几乎变成一条水平直线

这不是代码 bug,而是 ARMA 的固有行为。平稳 ARMA 模型的长步预测会向无条件均值回归,预测值最终收敛到一个常数。如果数据做了过度差分,这个收敛过程会更快;如果模型里 AR 项接近单位根,前几步预测也会很平。解决方式是先用滚动预测评估短期误差,只把 3 到 5 步内的预测当可靠结果,超过 10 步的预测参考价值有限。如果业务确实需要长步预测,考虑引入外生变量,或者改用带趋势项的 ARIMA 结构。

5.3 现象:estimate 输出参数或标准误是 NaN

最常见的原因是参数冗余。AR 和 MA 同时设到很高阶数,比如 ARMA(4,4),两个部分会互相抢解释力,优化器在参数空间里找不到稳定的尖峰,标准误就变成 NaN。另一个常见原因是序列太短,数据点还不够估计这么多参数。解决方式是先用 AIC 网格搜索砍掉冗余阶数,不要手动把 p、q 都调到 4 或 5。还可以给优化器提供初值,arima 函数支持 'AR0' 和 'MA0' 参数,给定一组贴近真实值的起步点,收敛会顺利很多。

5.4 现象:老版本代码里的 garchset / garchfit 已经无法运行

这个坑在接手别人的旧工程时特别常见。早期 MATLAB 的 Econometrics Toolbox 用 garchset、garchfit 这一套接口建 ARMA 模型,后来被统一收进 arima 函数体系,很多老接口已经移除了。解决方式是不要试图兼容旧接口,直接把模型定义改成 arima、estimate、forecast 三段式。改名不算复杂,但要注意 garchset 里用 'AR' 和 'MA' 指定阶数的写法,对应到 arima 里是 'ARLags' 和 'MALags',参数名称对不上也会直接报错。

5.5 现象:预测值出现负占比,或者超出 0~1 的合理区间

比例序列天然被限制在 0 到 1 之间,但 ARMA 模型没有这个约束,预测值完全可能跑到负数或大于 1。这是模型结构限制,不是数据问题。解决方式有两种:如果只是短期预测,可以直接把超出边界的值截断到 [0,1];如果预测步长较长,建议先对数据做 logit 变换,建模预测后再用逆变换还原。

% 对接近边界的比率做 logit 变换,避开 0 和 1 的奇点 rawCapped = max(min(rawTcp, 1 - 1e-6), 1e-6); yLogit = log(rawCapped ./ (1 - rawCapped)); % 预测拿到 yLogitHat 后,还原回占比 yhat = 1 ./ (1 + exp(-yLogitHat));

注意 logit 变换前要把数据夹紧到 1e-6 和 1-1e-6 之间,否则取对数会得到无穷大。这条坑在流量占比序列里很容易触发,因为某些协议在空闲时段占比本来就接近 0,模型稍微波动一下就预测出负值。做了 logit 变换后,预测值和置信区间都会自动落在合理范围内。

6. 让这套流量预测更可信:滚动验证与残差白噪声检验

模型估计完就画预测图,只能看到「像不像」,看不到「稳不稳」。我最后一步会做两件事:滚动预测算误差,以及残差白噪声检验。这两件事做完,模型能不能拿去汇报,心里才有底。

滚动预测的做法是固定模型结构,但不断扩充训练集,每次重新估计参数并只预测一步。

n = length(trainN); yhatRoll = nan(n - 1, 1); for t = 2:n tmpMdl = estimate(Mdl, trainN(1:t-1), 'Display', 'off'); yhatRoll(t-1) = forecast(tmpMdl, 1, 'Y0', trainN(1:t-1)); end errRoll = trainN(2:n) - yhatRoll; rmseRoll = sqrt(mean(errRoll.^2));

滚动预测和一次性切分的区别在于,它每次都用了最新数据重新估计参数,更接近真实在线预测的处境。rmseRoll 会比固定切分的 RMSE 更可靠。如果滚动误差明显小于固定切分误差,说明模型状态随时间变化,固定参数会高估预测能力。

残差白噪声检验用 Ljung-Box Q 统计量,MATLAB 里直接调 lbqtest。

[hLBQ, pLBQ] = lbqtest(res, 'Lags', 10); % pLBQ > 0.05 说明残差没有显著自相关,模型已把线性结构提取干净

pLBQ 大于 0.05 时就认为残差是白噪声。如果 pLBQ 接近 0,说明残差里还有可利用的自相关结构,需要回到第 3 章把阶数调高,直到这条通过为止。

从那以后,我每次拿到任何一套时间序列资源,都会强制自己先跑一遍 adftest、autocorr、滚动预测三件套,再开始调参数;残差没到白噪声,预测结果我是不敢拿去交差的。理解阶数怎么定、参数怎么设、边界在哪里,比记住一个函数名重要得多。这套 ARMA.rar 里的数据和组织方式,值得你照着跑一遍,跑完你就有自己的时间序列预测脚手架了。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 8:00:50

IT运维监控与可观测性:现代系统稳定运行的基石

1. IT运维监控与可观测性:现代系统稳定运行的基石凌晨三点,当服务器突然出现异常流量激增时,运维团队如何快速定位问题根源?当用户反馈页面加载缓慢时,如何判断是前端代码、后端API还是数据库查询导致的性能瓶颈&#…

作者头像 李华
网站建设 2026/10/26 8:00:16

基于Python的自然语言处理应用程序设计与实现:从源码到部署

简介:这份源码资源面向具备一定Python基础、希望动手实践自然语言处理的学习者与开发者,提供一套可直接运行与二次开发的应用程序框架。项目围绕分词、命名实体识别、文本分类与文本聚类四大核心模块展开,涵盖HMM分词、CRF与感知机命名实体识…

作者头像 李华
网站建设 2026/10/26 8:00:09

深度学习与计算机视觉核心技术解析与应用实践

1. 深度学习与计算机视觉的核心领域解析深度学习与计算机视觉的结合正在重塑我们理解世界的方式。作为一名长期从事该领域研发的工程师,我发现这两个方向的交叉融合已经催生出无数改变生活的应用。从智能手机的人脸解锁到自动驾驶的环境感知,背后都离不开…

作者头像 李华
网站建设 2026/10/26 8:00:09

Stable Diffusion全流程实践:从训练到部署指南

1. 项目概述:Stable Diffusion全流程实践指南作为一名计算机视觉从业者,我完整经历了从零开始搭建Stable Diffusion环境到最终产出可用模型的整个过程。这个开源项目确实改变了图像生成领域的游戏规则,但网上大多数教程要么过于碎片化&#x…

作者头像 李华
网站建设 2026/10/26 7:59:32

OpenMontage:面向专业视频工作流的开源智能编排系统

1. 项目概述:OpenMontage不是另一个AI视频工具,而是一套面向专业视频工作流的开源智能编排系统OpenMontage这个名字乍一听像某个新出的AI剪辑App,但实际接触过它的人都会立刻意识到——它根本不是给小白用户点几下鼠标就能出片的那种“傻瓜工…

作者头像 李华
网站建设 2026/10/26 7:59:32

端到端测试(e2e)原理、选型与工程落地实战

1. 项目概述:e2e到底在测什么,为什么它成了Web和Mobile开发绕不开的坎“e2e”这三个字母缩写,现在几乎刻在每个现代Web和Mobile项目CI/CD流水线的启动脚本里。它不是某个具体工具的名字,也不是某家公司的私有协议,而是…

作者头像 李华