跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
MATLAB / OctaveAI算法

MATLAB 实现基于季节性趋势分解(STL)的时间序列预测

介绍在 MATLAB 中实现基于季节性趋势分解(STL)的时间序列预测方法。通过自定义函数将时间序列分解为趋势项、季节项和余项,分别对趋势和余项建立模型(如线性回归、ARIMA),利用周期重复外推季节项,最后重构预测结果。文中提供了完整的代码示例、可视化步骤及性能评估建议,适用于电力负荷、销售数据等具有明显季节性和趋势成分的场景。

t ag发布于 2026/3/24更新于 2026/7/611K 浏览

MATLAB 实现基于季节性趋势分解(STL)的时间序列预测

本文介绍在 MATLAB 中实现基于季节性趋势分解(STL, Seasonal and Trend decomposition using Loess)进行时间序列预测的项目实例。该方法适用于具有明显季节性和趋势成分的时间序列(如电力负荷、气温、销售数据等),通过 STL 分解后对各成分分别建模,再组合实现预测。

项目目标

对时间序列进行 STL 分解: $$y_t = T_t + S_t + R_t$$ 其中:$T_t$ = 趋势项,$S_t$ = 季节项,$R_t$ = 余项(残差)

  1. 对趋势项和余项分别建立预测模型(如 ARIMA、线性回归、MLP 等)
  2. 利用已知的季节模式(周期重复)外推季节项
  3. 重构预测结果:$$\hat{y}{t+h} = \hat{T}{t+h} + \hat{S}{t+h} + \hat{R}{t+h}$$

注意:MATLAB 没有内置 STL 函数,但可通过 movmean + 自定义 Loess 或使用替代方案。为保持纯 MATLAB 实现,我们采用近似 STL 的经典三步滤波法(Cleveland et al. 方法简化版)。

推荐方案:使用 MATLAB 官方 stl 替代函数(自定义实现)

由于 R2023a 起 MATLAB 仍未提供 stl,我们将使用一个高效、开源的 MATLAB STL 实现。

步骤 1:定义 STL 函数

以下是一个简化版 STL(基于滑动平均 + 季节周期对齐),适合教学或快速原型:

function [trend, seasonal, remainder] = simple_stl(y, period, nIter)
% SIMPLE_STL: 简化版 STL 分解(非 Loess,但保留核心思想)
% 输入:
% y - 时间序列 (列向量)
% period - 季节周期(如 12 表示月度数据年周期)
% nIter - 内部迭代次数(默认 2)
% 输出:
% trend, seasonal, remainder

if nargin < 3, nIter = 2; end
n = length(y);
seasonal = zeros(n, 1);
trend = zeros(n, 1);

% 初始化
detrended = y;

for iter = 1:nIter
    % Step 1: 提取季节项(按周期分组取中位数/均值)
    seasonal = zeros(n, 1);
    for i = 1:period
        idx = i:period:n;
        if ~isempty(idx)
            val = detrended(idx);
            seasonal(idx) = mean(val); % 可改用 median 更鲁棒
        end
    end

    % 去除季节项
    deseason = y - seasonal;

    % Step 2: 提取趋势项(用移动平均平滑)
    win = min(2*floor(period/2)+1, floor(n/5)); % 窗口大小
    if mod(win,2)==0, win = win+1; end
    trend = smoothdata(deseason, 'movmean', win);

    % 更新去趋势序列用于下一轮季节提取
    detrended = y - trend;
end

remainder = y - trend - seasonal;
end

对于高精度需求,建议使用完整 Loess 版本。

步骤 2:加载或生成时间序列数据

% 示例:合成带趋势 + 季节 + 噪声的数据
t = (1:200)';
season = 10 * sin(2*pi*t/12); % 周期=12(月度)
trend = 0.1 * t; % 线性增长趋势
noise = 2 * randn(size(t)); % 随机噪声
y = trend + season + noise + 50; % 基准值 50

% 可视化
figure;
plot(t, y, 'k'); xlabel('Time'); ylabel('Value');
title('Original Time Series with Trend + Seasonality');

步骤 3:执行 STL 分解

period = 12; % 假设年度季节性(月度数据)
[trend, seasonal, remainder] = simple_stl(y, period);

% 可视化分解结果
figure;
subplot(4,1,1); plot(y); title('Original'); grid on;
subplot(4,1,2); plot(trend); title('Trend'); grid on;
subplot(4,1,3); plot(seasonal); title('Seasonal'); grid on;
subplot(4,1,4); plot(remainder); title('Remainder'); grid on;

步骤 4:分别预测各成分

4.1 预测季节项 $S_{t+h}$

季节项是周期性的,直接重复最后一个完整周期:

h = 24; % 预测未来 24 步
lastCycle = seasonal(end-period+1:end);
future_seasonal = repmat(lastCycle, ceil(h/period), 1);
future_seasonal = future_seasonal(1:h);
4.2 预测趋势项 $T_{t+h}$

使用简单线性回归(或 ARIMA、MLP):

% 线性拟合趋势
p = polyfit(t, trend, 1); % 一次多项式
t_future = (length(y)+1 : length(y)+h)';
future_trend = polyval(p, t_future);

% 更高级:可用 arima 模型拟合趋势
mdl = arima('Constant', 0, 'D', 1, 'Seasonality', 0, 'MALags', 1);
estMdl = estimate(mdl, trend);
[future_trend, ~] = forecast(estMdl, h, 'Y0', trend);
4.3 预测余项 $R_{t+h}$

余项通常视为白噪声,预测为 0;若存在自相关,可用 AR 模型:

% 简单处理:设为 0(或用 AR(1))
future_remainder = zeros(h, 1);

% 可选:AR(1) 拟合余项
if std(remainder) > 1e-6
    armdl = arima(1,0,0);
    armdl = estimate(armdl, remainder, 'Display', 'off');
    [future_remainder, ~] = forecast(armdl, h, 'Y0', remainder);
else
    future_remainder = zeros(h, 1);
end

步骤 5:重构预测结果

y_pred = future_trend + future_seasonal + future_remainder;

% 可视化完整预测
t_all = [t; t_future];
y_all = [y; NaN(h,1)];

figure;
plot(t, y, 'b', 'LineWidth', 1.5); hold on;
plot(t_future, y_pred, 'r--', 'LineWidth', 2);
xlabel('Time'); ylabel('Value');
legend('Historical', 'STL Forecast');
title('STL-Based Time Series Forecasting');
grid on;

步骤 6:评估预测性能(若有真实未来值)

% 假设有真实未来值 y_true(实际中可能没有)
% y_true = ... ;
% rmse = sqrt(mean((y_pred - y_true).^2));
% fprintf('Forecast RMSE: %.2f\n', rmse);

改进建议

成分改进方法
趋势项使用 Prophet、LSTM、SVR、或局部加权回归(Loess)
季节项多重季节性(如周 + 年)、傅里叶级数拟合
余项GARCH 模型(波动聚集)、ResNet 残差学习
整体框架结合 EMD/VMD + STL,或使用 TBATS、Facebook Prophet

实际应用建议

  • 数据频率:确保 period 设置正确(日数据:7/365;小时数据:24/168)
  • 缺失值处理:STL 对缺失敏感,需插值(fillmissing)
  • 非固定周期:考虑使用动态时间规整(DTW)或小波分解

总结

本项目展示了如何在纯 MATLAB 环境下:

  1. 实现 STL 分解(简化版);
  2. 分别建模趋势、季节、余项;
  3. 重构未来预测;
  4. 可视化与评估。

若你有真实数据集(如电力负荷、零售销量),只需替换 y 和 period 即可直接应用。

目录

  1. MATLAB 实现基于季节性趋势分解(STL)的时间序列预测
  2. 项目目标
  3. 推荐方案:使用 MATLAB 官方 stl 替代函数(自定义实现)
  4. 步骤 1:定义 STL 函数
  5. 步骤 2:加载或生成时间序列数据
  6. 步骤 3:执行 STL 分解
  7. 步骤 4:分别预测各成分
  8. 4.1 预测季节项 $S_{t+h}$
  9. 4.2 预测趋势项 $T_{t+h}$
  10. 4.3 预测余项 $R_{t+h}$
  11. 步骤 5:重构预测结果
  12. 步骤 6:评估预测性能(若有真实未来值)
  13. 改进建议
  14. 实际应用建议
  15. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Qt for Python:PySide6 入门指南
  • 基于SOE算法的多时段随机配电网重构方法
  • Matlab 找不到编译器解决方案:MinGW-w64 C/C++环境配置
  • C++ 实现 MATLAB ismember 函数原理与代码解析
  • MATLAB 2025a 发布:深色模式与 Copilot 编程助手功能详解
  • MATLAB 2025a 发布:深色模式与 Copilot 编程助手上线
  • MATLAB 2025a 发布:深色模式与 Copilot 编程助手上线
  • MATLAB 与 Python 苹果检测技术对比:传统特征工程与深度学习
  • 大语言模型(LLMs)全面学习指南
  • MATLAB 数值与字符串类型转换实战
  • LIBERO:终身机器人学习综合基准测试平台
  • Material Files:Android 开源文件管理器深度体验
  • Windows 11 与 Ubuntu 20.04 双系统安装教程
  • Matcha-TTS 论文解读:基于条件流匹配的快速 TTS 架构
  • MarianCG:受机器翻译启发的代码生成 Transformer 模型
  • Java Map 和 Set 数据结构详解与对比
  • 基于大模型和 RAG 的智能 Text2SQL 问答系统:SQLBot
  • 国产开源 AI 工具爱派 (AiPy) 支持本地部署与 Python 自动化办公
  • C++ explicit 关键字详解
  • AR 眼镜的硬件、算法和落地场景

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online