跳到主要内容

一次指数平滑

一、直观理解:越近的观察权重越大​

一次指数平滑(Simple Exponential Smoothing, SES)适合没有明显趋势和季节、围绕某个缓慢变化的水平波动的序列。它维护一个水平状态 ltl_t:

lt=αyt+(1−α)lt−1,y^t+h∣t=lt(h=1,2,…)l_t=\alpha y_t+(1-\alpha)l_{t-1},\quad \hat y_{t+h|t}=l_t\quad (h=1,2,\ldots)

α∈(0,1)\alpha\in(0,1) 越大,越追随新数据;越小,越平滑。展开后,ltl_t 是历史观测的指数衰减加权平均,故名“指数平滑”。

多步预测全部等于当前水平:它认为未来没有系统性上升或下降。若序列明显有趋势,应改用二次(Holt)平滑。

二、适用场景与优缺点​

类型说明
适用场景近似平稳或水平缓慢漂移;无季节;需要快速基线;样本短到中等。
核心优点只需一个参数;计算极简;常能打败复杂模型的“过度想象”;易解释。
局限与缺点不能外推趋势/季节;α\alpha 选不好会滞后或过敏;预测区间需额外假设;结构突变后需时间适应。

三、核心原理​

递推等价于

lt=α∑j=0t−2(1−α)jyt−j+(1−α)t−1l0l_t=\alpha\sum_{j=0}^{t-2}(1-\alpha)^j y_{t-j}+(1-\alpha)^{t-1}l_0

最优 α\alpha 通常通过最小化训练期一步预测 SSE/MSE 得到,也可用验证段选取。

初始化常见选择:l0=y1l_0=y_1,或前若干点均值。

在状态空间观点下,SES 对应简单的局部水平模型,可据此构造预测方差随 hh 增加的区间;竞赛中至少应给点预测,并说明区间假设。

四、参数选择与评价​

  1. 画图确认无明显趋势/季节;
  2. 在训练期网格搜索 α∈{0.05,0.1,…,0.95}\alpha\in\{0.05,0.1,\ldots,0.95\};
  3. 用一步预测误差或时间序列交叉验证;
  4. 测试期报告 RMSE/MAE,对比“均值预测”与“朴素 y^t+1=yt\hat y_{t+1}=y_t”;
  5. 若测试期出现趋势,模型会系统滞后——这是信号,不是调 α\alpha 能彻底解决的。

五、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));

论文中必须区分“一次性多步”与“滚动一步”。

六、如何解释结果​

报告:

  1. 为何认为无趋势/无季节(图示);
  2. α^\hat\alpha 与选择准则;
  3. 初始水平如何设定;
  4. 测试误差及基线对比;
  5. 预测水平值的业务含义;
  6. 若 SES 显著差于 Holt,说明存在趋势。

七、常见误区​

1. 有趋势仍用一次平滑​

预测会系统性偏低或偏高。

2. 把平滑曲线当未来预测却用了未来点​

smoothdata 中心窗口会泄漏,不能直接当预测。

3. α=1\alpha=1 或 00 走极端​

α=1\alpha=1 即朴素法;α→0\alpha\to 0 接近永久均值。应数据驱动选择。

4. 只报训练拟合​

平滑训练期总是能贴,关键在测试期。

八、小结​

一次指数平滑的核心是:

用指数衰减权重维护当前水平,并用该水平作为未来所有步的预测。

它是最重要的预测基线之一。任何更复杂的时间序列模型,若在水平型序列上打不赢调好的 SES,都要反省复杂度是否必要。评价必须基于训练期外误差,而不是曲线好看或 R2R^2。