时间序列预测实战:指数平滑法详解与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α2[St(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神经网络与平滑技术的混合建模

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

相关推荐
dundunmm30 分钟前
【每天一个知识点】训推一体机
人工智能·大模型·硬件·软件·训练·推理
johnny2332 小时前
OCR、文档解析工具合集(下)
人工智能
Uzuki3 小时前
LLM 指标 | PPL vs. BLEU vs. ROUGE-L vs. METEOR vs. CIDEr
深度学习·机器学习·llm·vlm
Moshow郑锴3 小时前
实践题:智能客服机器人设计
人工智能·机器人·智能客服
2501_924889554 小时前
商超高峰客流统计误差↓75%!陌讯多模态融合算法在智慧零售的实战解析
大数据·人工智能·算法·计算机视觉·零售
jingfeng5144 小时前
C++模板进阶
java·c++·算法
维基框架5 小时前
维基框架 (Wiki Framework) 1.1.0 版本发布 提供多模型AI辅助开发
人工智能
西猫雷婶5 小时前
神经网络|(十二)概率论基础知识-先验/后验/似然概率基本概念
人工智能·神经网络·机器学习·回归·概率论
地平线开发者5 小时前
征程 6X | 常用工具介绍
算法·自动驾驶
地平线开发者5 小时前
理想汽车智驾方案介绍 2|MindVLA 方案详解
算法·自动驾驶