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

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

相关推荐
董厂长1 小时前
langchain :记忆组件混淆概念澄清 & 创建Conversational ReAct后显示指定 记忆组件
人工智能·深度学习·langchain·llm
董董灿是个攻城狮4 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki4 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
G皮T4 小时前
【人工智能】ChatGPT、DeepSeek-R1、DeepSeek-V3 辨析
人工智能·chatgpt·llm·大语言模型·deepseek·deepseek-v3·deepseek-r1
九年义务漏网鲨鱼4 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
元宇宙时间5 小时前
Playfun即将开启大型Web3线上活动,打造沉浸式GameFi体验生态
人工智能·去中心化·区块链
开发者工具分享5 小时前
文本音频违规识别工具排行榜(12选)
人工智能·音视频
产品经理独孤虾5 小时前
人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像
人工智能·机器学习·ai·大模型·产品经理·商品画像·商品工业属性
老任与码5 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
蹦蹦跳跳真可爱5895 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉