指数平滑算法是一种应用广泛的时间序列算法,在一般情况下,时间序列的数值变化规律有以下四种如图1,不同的指数平滑算法应用于不同的变化规律,本文章重点讲解“简单指数平滑”,其适用于无长期变动规律,无季节变动规律的情况。
那什么是无长期变动规律,无季节变动规律呢?我们举个例子。如下图,总体趋势是不断递增的,这说明数据具有长期变动趋势,也就是从长远来的趋势。如果在一年中都有在特定的月份中销售量很高或很低,表现出的规律为季节变动规律,季节变动规律一般以年为区间中的月份为考查重点。
时间序列预测要求我们根据过去的观测值从而预测未来的数据,预测是使用加权平均值计算的,其中权重随着过去的观测值呈指数级下降 — 最小的权重与最早的观测值相关联。简单来说,越新的数据对未来的影响更大,越旧的数据对未来的影响更小。对最近的观测结果给予更大的权重,而不是对遥远过去的观测结果给予更大的权重可能是明智的。
简单指数平滑法的公式如下:
Y`t+1 = a*Yt + (1-t)*Y`t
其中Y`t+1--t+1期的预测值;Yt--t期的实际值;Y`t--t期的预测值;a为平滑系数,a 越小,平滑作用越强,但对实际数据的变动反应较迟缓。
如果有不明白的部分,可以看看这本书:7.1 简单的指数平滑 |预测:原理与实践(第2版) (otexts.com)
如果有些小伙伴没有数据,可以利用pandas和numpy生成数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
time = pd.Series(data = np.random.rand(10),index = np.date_range("2024-02-24",periods = 10,freq="3D"))
plt.plot(time)
plt.xticks(time.index[::2],rotation = 45)
折线图如下:
接下来,假设平滑指数为0.5,用python实现简单指数平滑:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 单指数平滑
# 一次指数平滑法只适用于水平型历史数据的预测
def exponential_smoothing(series, alpha):
result = [series[0]]
for n in range(1, len(series)):
# Y`t+1 = a*Yt + (1-t)*Y`t
result.append(alpha * series[n] + (1 - alpha) * result[n-1])
return result
def plotExponentialSmoothing(series, alphas):
with plt.style.context('seaborn-white'):
plt.figure(figsize=(15, 7))
for alpha in alphas:
plt.plot(exponential_smoothing(series, alpha), label="Alpha {}".format(alpha))
plt.plot(series.values,"c",label = "Actual")
plt.legend(loc="best")
plt.axis('tight')
plt.title("Exponential Smoothing")
plt.grid(True);
plotExponentialSmoothing(df['累计长度'], [0.5])
结果如下图,能明显感觉到数据变得更加平滑。
简单指数平滑值序列出现一定的滞后偏差的程度随着权系数(平滑系数)a 的增大而减少,但当时间序列的变动出现直线趋势时,用一次指数平滑法来进行预测仍将存在着明显的滞后偏差,需要二次指数平滑来解决。如果本文对你有帮助,就多多支持,后续会继续更新指数平滑的指数讲解。