时间序列预测实战:指数平滑法详解与MATLAB实现

摘要

本文系统讲解指数平滑法的核心理论与实战应用,涵盖一次、二次、三次及差分指数平滑技术。通过电器销售额预测、发电量趋势分析等案例,详细解析加权系数选择、初始值设定与误差修正机制,并提供完整的MATLAB实现代码。结合预测误差评估与模型优化策略,为读者提供从基础理论到工业级应用的全流程方法论。

关键词:指数平滑法 加权系数 预测模型 误差修正 MATLAB实现


一、指数平滑法基础理论

1.1 核心思想

指数平滑法通过对历史数据赋予指数衰减权重,构建动态预测模型。其核心公式为加权平均:
S t = α y t + ( 1 − α ) S t − 1 S_t = \alpha y_t + (1-\alpha)S_{t-1} St=αyt+(1−α)St−1

其中 α \alpha α 为平滑系数( 0 < α < 1 0<\alpha<1 0<α<1),体现新数据与历史信息的权衡。

1.2 方法分类

类型 适用场景 数学特性
一次指数平滑 无趋势/季节性的平稳序列 单参数线性模型
二次指数平滑 线性趋势序列 双重平滑消除滞后偏差
三次指数平滑 非线性趋势/季节性序列 三次多项式拟合
差分指数平滑 非平稳序列 结合差分与平滑技术

二、一次指数平滑法

2.1 预测模型

递推公式
S t ( 1 ) = α y t + ( 1 − α ) S t − 1 ( 1 ) S_t^{(1)} = \alpha y_t + (1-\alpha) S_{t-1}^{(1)} St(1)=αyt+(1−α)St−1(1)
预测方程
y ^ t + 1 = S t ( 1 ) \hat{y}_{t+1} = S_t^{(1)} y^t+1=St(1)

2.2 参数选择策略

2.2.1 平滑系数 α \alpha α
  • 低 α \alpha α值(0.1-0.3):适用于平稳数据,保留长期历史信息
  • 高 α \alpha α值(0.6-0.8):适用于波动数据,快速响应趋势变化
2.2.2 初始值 S 0 ( 1 ) S_0^{(1)} S0(1)
  • 数据量>20 :取首项 S 0 ( 1 ) = y 1 S_0^{(1)} = y_1 S0(1)=y1
  • 数据量<20 :取前3-5项平均值 S 0 ( 1 ) = 1 k ∑ i = 1 k y i S_0^{(1)} = \frac{1}{k}\sum_{i=1}^k y_i S0(1)=k1∑i=1kyi

2.3 电器销售额预测案例

2.3.1 数据样本

某市1976-1987年电器销售额(万元):

年份 销售额 年份 销售额
1976 50 1982 51
1977 52 1983 40
1978 47 1984 48
1979 51 1985 52
1980 49 1986 51
1981 48 1987 59
2.3.2 MATLAB实现
matlab 复制代码
clc, clear
y = [50, 52, 47, 51, 49, 48, 51, 40, 48, 52, 51, 59];
alpha = [0.2, 0.5, 0.8]; % 测试不同平滑系数
n = length(y);
S0 = mean(y(1:2)); % 初始值取前两项平均

% 指数平滑计算
for a = 1:length(alpha)
    S = S0;
    yhat{a}(1) = S;
    for t = 2:n
        S = alpha(a)*y(t-1) + (1-alpha(a))*S;
        yhat{a}(t) = S;
    end
    error(a) = sqrt(mean((y(2:end) - yhat{a}(2:end)).^2));
end

% 结果可视化
plot(1976:1987, y, 'ko-', 'LineWidth', 1.5); hold on;
plot(1977:1987, yhat{1}(2:end), 'r--');
plot(1977:1987, yhat{2}(2:end), 'b-.');
plot(1977:1987, yhat{3}(2:end), 'g:');
legend('实际值','α=0.2','α=0.5','α=0.8');
xlabel('年份'); ylabel('销售额(万元)');
2.3.3 误差分析
α值 预测标准误差
0.2 4.50
0.5 4.59
0.8 4.84

结论 :选择α=0.2时误差最小,1988年预测值为:
y ^ 1988 = 0.2 × 59 + 0.8 × 49.22 = 51.18 万元 \hat{y}_{1988} = 0.2 \times 59 + 0.8 \times 49.22 = 51.18 \text{万元} y^1988=0.2×59+0.8×49.22=51.18万元


三、二次指数平滑法

3.1 模型原理

通过双重平滑处理线性趋势,预测公式为:
y ^ t + m = a t + b t m \hat{y}_{t+m} = a_t + b_t m y^t+m=at+btm

其中:
a t = 2 S t ( 1 ) − S t ( 2 ) a_t = 2S_t^{(1)} - S_t^{(2)} at=2St(1)−St(2)
b t = α 1 − α ( S t ( 1 ) − S t ( 2 ) ) b_t = \frac{\alpha}{1-\alpha}(S_t^{(1)} - S_t^{(2)}) bt=1−αα(St(1)−St(2))

3.2 发电量预测案例

3.2.1 计算步骤
  1. 一次平滑
    S t ( 1 ) = α y t + ( 1 − α ) S t − 1 ( 1 ) S_t^{(1)} = \alpha y_t + (1-\alpha)S_{t-1}^{(1)} St(1)=αyt+(1−α)St−1(1)
  2. 二次平滑
    S t ( 2 ) = α S t ( 1 ) + ( 1 − α ) S t − 1 ( 2 ) S_t^{(2)} = \alpha S_t^{(1)} + (1-\alpha)S_{t-1}^{(2)} St(2)=αSt(1)+(1−α)St−1(2)
3.2.2 MATLAB实现
matlab 复制代码
% 数据输入
y = [676, 825, 774, 716, 940, 1159, 1384, 1524, 1668, 1688, 1958, 2031, 2234, 2566, 2820, 3006, 3093, 3277, 3514, 3770, 4107];
alpha = 0.3;
S1 = zeros(size(y)); S2 = zeros(size(y));

% 初始化
S1(1) = y(1); 
S2(1) = y(1);

% 双重指数平滑
for t = 2:length(y)
    S1(t) = alpha*y(t) + (1-alpha)*S1(t-1);
    S2(t) = alpha*S1(t) + (1-alpha)*S2(t-1);
end

% 计算预测参数
a = 2*S1(end) - S2(end);
b = alpha/(1-alpha)*(S1(end)-S2(end));
forecast = a + b*[1,2]; % 未来两年预测
3.2.3 预测结果
年份 预测值(亿度) 增长率
1986 4223.95 +5.1%
1987 4434.19 +5.0%

四、三次指数平滑法

4.1 模型方程

适用于非线性趋势与季节性叠加场景:
y ^ t + m = a t + b t m + c t m 2 \hat{y}_{t+m} = a_t + b_t m + c_t m^2 y^t+m=at+btm+ctm2

参数计算公式:
a t = 3 S t ( 1 ) − 3 S t ( 2 ) + S t ( 3 ) a_t = 3S_t^{(1)} - 3S_t^{(2)} + S_t^{(3)} at=3St(1)−3St(2)+St(3)
b t = α 2 ( 1 − α ) 2 ( 6 − 5 α ) S t ( 1 ) − 2 ( 5 − 4 α ) S t ( 2 ) + ( 4 − 3 α ) S t ( 3 ) b_t = \frac{\alpha}{2(1-\alpha)^2}(6-5\\alpha)S_t\^{(1)} - 2(5-4\\alpha)S_t\^{(2)} + (4-3\\alpha)S_t\^{(3)} bt=2(1−α)2α(6−5α)St(1)−2(5−4α)St(2)+(4−3α)St(3)
c t = α 2 2 ( 1 − α ) 2 S t ( 1 ) − 2 S t ( 2 ) + S t ( 3 ) c_t = \frac{\alpha^2}{2(1-\alpha)^2}S_t\^{(1)} - 2S_t\^{(2)} + S_t\^{(3)} ct=2(1−α)2α2St(1)−2St(2)+St(3)

4.2 固定资产投资预测

4.2.1 数据样本

某省1978-1988年固定资产投资(亿元):

matlab 复制代码
investment = [20.04, 20.06, 25.72, 34.61, 51.77, 55.92, 80.65, 131.11, 148.58, 162.67, 232.26];
4.2.2 MATLAB实现
matlab 复制代码
alpha = 0.3;
S1 = zeros(size(investment));
S2 = zeros(size(investment));
S3 = zeros(size(investment));

% 三次指数平滑
for t = 1:length(investment)
    if t == 1
        S1(t) = mean(investment(1:3));
        S2(t) = S1(t);
        S3(t) = S1(t);
    else
        S1(t) = alpha*investment(t) + (1-alpha)*S1(t-1);
        S2(t) = alpha*S1(t) + (1-alpha)*S2(t-1);
        S3(t) = alpha*S2(t) + (1-alpha)*S3(t-1);
    end
end

% 计算预测参数
a = 3*S1(end) - 3*S2(end) + S3(end);
b = (alpha/(2*(1-alpha)^2)) * ((6-5*alpha)*S1(end) - 2*(5-4*alpha)*S2(end) + (4-3*alpha)*S3(end));
c = (alpha^2/(2*(1-alpha)^2)) * (S1(end) - 2*S2(end) + S3(end));

% 二次曲线预测
m = [1,2]; % 预测未来两年
forecast = a + b*m + c*m.^2;

五、差分指数平滑法

5.1 一阶差分法

适用场景:线性增长趋势的非平稳序列

计算步骤

  1. 计算一阶差分:
    ∇ y t = y t − y t − 1 \nabla y_t = y_t - y_{t-1} ∇yt=yt−yt−1
  2. 对差分序列指数平滑:
    ∇ y ^ t + 1 = α ∇ y t + ( 1 − α ) ∇ y ^ t \nabla \hat{y}_{t+1} = \alpha \nabla y_t + (1-\alpha)\nabla \hat{y}_t ∇y^t+1=α∇yt+(1−α)∇y^t
  3. 还原预测值:
    y ^ t + 1 = ∇ y ^ t + 1 + y t \hat{y}{t+1} = \nabla \hat{y}{t+1} + y_t y^t+1=∇y^t+1+yt

5.2 燃料消耗量预测案例

5.2.1 MATLAB代码
matlab 复制代码
y = [24, 26, 27, 30, 32, 33, 36, 40, 41, 44];
alpha = 0.4;
dY = diff(y); % 一阶差分

% 差分序列平滑
forecast_diff = zeros(size(dY));
forecast_diff(1) = dY(1); % 初始值
for t = 2:length(dY)
    forecast_diff(t) = alpha*dY(t-1) + (1-alpha)*forecast_diff(t-1);
end

% 还原预测值
forecast = y(end) + forecast_diff(end);
5.2.2 预测结果

y ^ 1987 = 44 + 2.49 = 46.49 百吨 \hat{y}_{1987} = 44 + 2.49 = 46.49 \text{百吨} y^1987=44+2.49=46.49百吨


六、方法对比与工程实践

6.1 性能评估矩阵

指标 一次平滑 二次平滑 三次平滑 差分平滑
趋势捕捉能力 ★★☆☆☆ ★★★★☆ ★★★★★ ★★★☆☆
计算复杂度 ★☆☆☆☆ ★★☆☆☆ ★★★★☆ ★★☆☆☆
参数敏感性 较高
数据要求 >20点 >30点 >50点 >15点

6.2 实施路线图

  1. 数据预处理

    • 缺失值处理:线性插值或季节插补
    matlab 复制代码
    y_filled = fillmissing(y, 'linear');
  2. 模型选择流程

    否 是 线性 非线性 不平稳 原始数据 存在趋势? 一次指数平滑 趋势形态? 二次指数平滑 三次指数平滑 差分指数平滑

  3. 参数调优方法

    • 网格搜索法确定最优α值
    matlab 复制代码
    alphas = 0.1:0.1:0.9;
    for i = 1:length(alphas)
        model = smoothdata(y, 'exponential', alphas(i));
        mse(i) = mean((y(2:end) - model(1:end-1)).^2);
    end
    [~, idx] = min(mse);
    best_alpha = alphas(idx);

七、总结与扩展

指数平滑法凭借其简洁性、可解释性和良好的预测性能,在供应链管理、电力负荷预测、经济指标分析等领域广泛应用。进阶学习建议:

  1. 与ARIMA模型结合:处理复杂季节性模式
  2. 状态空间模型:Kalman滤波框架下的自适应平滑
  3. 机器学习融合:LSTM神经网络与平滑技术的混合建模

通过掌握本文介绍的核心方法,读者可构建出适用于大多数工业场景的预测系统,为决策提供可靠的数据支持。

相关推荐
冬奇Lab6 小时前
Workflow 系列(02):设计范式——四层架构、三种 Context 传递模式与确认门设计
人工智能·agent·工作流引擎
冬奇Lab6 小时前
每日一个开源项目(第145篇):Trellis - 把项目记忆、规范和任务上下文持久化进代码仓库
人工智能·开源·资讯
有道AI情报局6 小时前
Harness即产品
人工智能·agent
罗西的思考7 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
IT_陈寒8 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
笃行3508 小时前
从零到上线:用 EdgeOne Makers + CodeBuddy 搭一个「对账核对员」AI Agent
人工智能
用户6856326208699 小时前
Claude Code 乱猜字段名?我给它写了一个"数据库查询约束 Skill"
人工智能
你_好9 小时前
# 给你的产品嵌入一个「会操作界面的 AI 助手」
人工智能
ShallWeL9 小时前
【机器学习】(3)—— 线性回归:梯度下降
人工智能·机器学习
陈广亮9 小时前
Prompt、Context、Harness、Agentic:LLM 应用四层嵌套结构,搞清自己卡在哪一层
人工智能