基于灰色预测与指数平滑算法的MATLAB预测工具箱
项目简介
本项目不仅仅是一个代码脚本,而是一套集成了经典时间序列分析与灰色系统理论的综合预测工具箱。该项目专为解决不同特征的数据预测问题而设计,特别针对数学建模竞赛(如美赛、国赛)及工程数据分析场景。
工具箱核心整合了三种不同阶数的指数平滑算法与GM(1,1)灰色预测模型,能够自动处理从平稳序列到具有非线性增长趋势的各类数据。程序通过模块化设计,实现了从数据输入、模型训练、参数计算、未来趋势预测到全方位误差评估与可视化的完整流程。
功能特性
该工具箱主要包含以下核心功能模块:
- 多维度指数平滑预测:涵盖一次、二次和三次指数平滑算法,分别应对无趋势、线性趋势和抛物线非线性趋势的数据。
- 灰色系统预测 (Grey Prediction):内置GM(1,1)模型,专门针对“小样本、贫信息”系统设计,擅长捕捉指数增长规律。
- 全自动误差评估:自动计算并输出均方误差 (MSE)、平均绝对误差 (MAE) 和平均绝对百分比误差 (MAPE)。
- 综合可视化分析:生成包含原始数据拟合对比、未来预测点展示、相对误差柱状图及残差波动图的组合图表。
- 灵活的参数配置:支持自定义平滑系数 ($alpha$) 和向后预测步长。
算法实现细节
本项目在 main 函数及其辅助子函数中实现了以下具体的算法逻辑:
1. 一次指数平滑 (Single Exponential Smoothing)
- 适用场景:适用于没有明显趋势或季节性波动的平稳(水平型)序列。
- 实现逻辑:
* 使用递归公式 $S_t = alpha Y_t + (1-alpha)S_{t-1}$ 计算平滑值。
* 初始平滑值设为序列第一个观测值。
*
预测机制:采用平滞后一期的方式,即第 $t$ 期的平滑值作为第 $t+1$ 期的预测值。对于未来多步预测,由于缺乏趋势信息,预测值保持为最后一个时刻的平滑值(水平直线)。
2. 二次指数平滑 (Double Exponential Smoothing)
- 适用场景:适用于具有线性趋势的时间序列。
- 实现逻辑:
* 在一次平滑的基础上进行第二次平滑。
* 根据布朗 (Brown) 线性指数平滑模型,利用一次平滑值 $S'$ 和二次平滑值 $S''$ 计算当前时刻的截距参数 $a_t$ 和斜率参数 $b_t$。
*
预测机制:构建线性模型 $hat{y}_{t+m} = a_t + b_t times m$,能够沿现有的线性趋势向后推演。
3. 三次指数平滑 (Triple Exponential Smoothing)
- 适用场景:适用于具有非线性趋势(如抛物线加速增长)的时间序列。
- 实现逻辑:
* 进行三次连续的平滑计算,得到 $S', S'', S'''$。
* 推导并计算三个核心参数:截距 $a$、线性系数 $b$ 和二次系数 $c$。这些系数的计算公式复杂,依赖于平滑系数 $alpha$ 和各级平滑值的线性组合。
*
预测机制:构建二次多项式模型 $hat{y}_{t+m} = a_t + b_t times m + c_t times m^2$,能够捕捉数据的曲线变化特征。
4. 灰色预测 GM(1,1)
- 适用场景:适用于数据量少(如4个以上)、具有指数增长趋势或不确定性的系统。
- 实现逻辑:
*
累加生成 (AGO):对原始数据进行一次累加,削弱随机性,增强规律性。
*
紧邻均值生成:构造背景值矩阵 $B$ 和数据向量 $Y$。
*
参数估计:利用最小二乘法求解微分方程的发展系数 $a$ 和灰作用量 $b$。
*
时间响应与还原:构建指数形式的时间响应函数,计算出累加数据的预测值,最后通过
累减还原 (IAGO) 得到原始数据的预测结果。
使用方法
- 准备数据:
在脚本的“数据准备与参数设置”部分,修改
Y_history 数组为你需要分析的历史观测数据。
- 调整参数:
*
alpha:设置指数平滑系数(范围 0~1)。较小的值使模型更关注历史平均,较大的值使模型对近期变化更敏感。
*
n_predict:设置希望向后预测的步数(时间点数量)。
- 运行程序:
直接运行主程序脚本。
- 解读结果:
*
命令行输出:程序将在控制台打印出当前的数据配置、各模型的误差指标对比表(MSE, MAE, MAPE),以及未来 N 步的具体预测数值。
*
图形窗口:
*
主图:展示原始数据(黑色实线)、四种模型的拟合曲线(不同线型)以及未来的预测点(X标记)。
*
误差图:左下角展示各模型平均相对误差 (MAPE) 的柱状图,便于直观对比模型优劣。
*
残差图:右下角展示各模型在各个历史时间点的残差波动情况,用于检验模型的稳定性。
系统要求
- MATLAB (任意包含基础统计和绘图功能的版本即可,代码未使用特殊工具箱函数)。
代码结构说明
该脚本是一个独立的各种功能集成的文件,内部结构如下:
- 主控部分:负责数据的定义、参数的初始化、调用各个预测算法函数、以及最终图表的绘制和结果打印。
- 性能计算模块:一个通用的辅助函数,用于接收真实值和预测值,统一计算并返回均方误差、平均绝对误差和平均绝对百分比误差。
- 算法函数模块:
* 一次指数平滑函数:输入原始序列与参数,输出拟合序列、预测序列及性能结构体。
* 二次指数平滑函数:内部包含双重平滑循环及线性参数解算。
* 三次指数平滑函数:内部包含三重平滑循环及二次性参数解算。
* 灰色预测函数:完全实现了GM(1,1)的矩阵运算与还原过程。