一次指数平滑
一、直观理解:越近的观察权重越大
一次指数平滑(Simple Exponential Smoothing, SES)适合没有明显趋势和季节、围绕某个缓慢变化的水平波动的序列。它维护一个水平状态 :
越大,越追随新数据;越小,越平滑。展开后, 是历史观测的指数衰减加权平均,故名“指数平滑”。
多步预测全部等于当前水平:它认为未来没有系统性上升或下降。若序列明显有趋势,应改用二次(Holt)平滑。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 近似平稳或水平缓慢漂移;无季节;需要快速基线;样本短到中等。 |
| 核心优点 | 只需一个参数;计算极简;常能打败复杂模型的“过度想象”;易解释。 |
| 局限与缺点 | 不能外推趋势/季节; 选不好会滞后或过敏;预测区间需额外假设;结构突变后需时间适应。 |
三、核心原理
递推等价于
最优 通常通过最小化训练期一步预测 SSE/MSE 得到,也可用验证段选取。
初始化常见选择:,或前若干点均值。
在状态空间观点下,SES 对应简单的局部水平模型,可据此构造预测方差随 增加的区间;竞赛中至少应给点预测,并说明区间假设。
四、参数选择与评价
- 画图确认无明显趋势/季节;
- 在训练期网格搜索 ;
- 用一步预测误差或时间序列交叉验证;
- 测试期报告 RMSE/MAE,对比“均值预测”与“朴素 ”;
- 若测试期出现趋势,模型会系统滞后——这是信号,不是调 能彻底解决的。
五、MATLAB 示例
%% 一次指数平滑:网格选 alpha + 训练期外评价
rng(3);
n = 120;
y = 20 + cumsum(0.05*randn(n,1)) + randn(n,1); % 缓慢漂移水平
T0 = 90;
yTrain = y(1:T0); yTest = y(T0+1:end);
alphas = 0.05:0.05:0.95;
sse = zeros(size(alphas));
for i = 1:numel(alphas)
a = alphas(i);
l = yTrain(1);
e2 = 0;
for t = 1:numel(yTrain)-1
yhat = l; % 一步预测
e2 = e2 + (yTrain(t+1)-yhat)^2;
l = a*yTrain(t+1) + (1-a)*l;
end
sse(i) = e2;
end
[~,iBest] = min(sse);
alpha = alphas(iBest);
fprintf("训练一步 SSE 最优 alpha=%.2f\n", alpha);
% 用最优 alpha 滚到训练期末
l = yTrain(1);
for t = 2:numel(yTrain)
l = alpha*yTrain(t) + (1-alpha)*l;
end
yhat_test = repmat(l, size(yTest)); % 多步=水平
rmse = sqrt(mean((yTest - yhat_test).^2));
rmse_naive = sqrt(mean((yTest - yTrain(end)).^2));
rmse_mean = sqrt(mean((yTest - mean(yTrain)).^2));
fprintf("测试 RMSE SES=%.3f, 末值=%.3f, 均值=%.3f\n", ...
rmse, rmse_naive, rmse_mean);
% 也可用 smoothdata 做展示性平滑(注意:平滑≠预测协议)
ys = smoothdata(yTrain, "movmean", 5);
figure;
plot(1:T0, yTrain, "k"); hold on;
plot(T0+1:n, yTest, "k");
plot(T0+1:n, yhat_test, "r","LineWidth",1.2);
xline(T0,"k--");
legend("训练","测试","SES 预测");
title(sprintf("一次指数平滑 (\\alpha=%.2f)", alpha));
滚动一步评价(更贴近在线预测)可写成:
l = yTrain(1);
for t = 2:T0
l = alpha*yTrain(t)+(1-alpha)*l;
end
err = zeros(size(yTest));
for k = 1:numel(yTest)
err(k) = yTest(k) - l;
l = alpha*yTest(k) + (1-alpha)*l; % 观测到后更新
end
rmse_roll = sqrt(mean(err.^2));
论文中必须区分“一次性多步”与“滚动一步”。
六、如何解释结果
报告:
- 为何认为无趋势/无季节(图示);
- 与选择准则;
- 初始水平如何设定;
- 测试误差及基线对比;
- 预测水平值的业务含义;
- 若 SES 显著差于 Holt,说明存在趋势。
七、常见误区
1. 有趋势仍用一次平滑
预测会系统性偏低或偏高。
2. 把平滑曲线当未来预测却用了未来点
smoothdata 中心窗口会泄漏,不能直接当预测。
3. 或 走极端
即朴素法; 接近永久均值。应数据驱动选择。
4. 只报训练拟合
平滑训练期总是能贴,关键在测试期。
八、小结
一次指数平滑的核心是:
用指数衰减权重维护当前水平,并用该水平作为未来所有步的预测。
它是最重要的预测基线之一。任何更复杂的时间序列模型,若在水平型序列上打不赢调好的 SES,都要反省复杂度是否必要。评价必须基于训练期外误差,而不是曲线好看或 。