基本思路:最近的过去态势,在某种程度上会持续的未来。指数平滑法是移动平均法中的一种,其特点在于给过去的观测值不一样的权重,即较近期观测值的权数比较远期观测值的权数要大。指数平滑法分为一次指数平滑法、二次指数平滑法和三次指数平滑法等等。
一次指数平滑法:
平滑值的基本公式:St = a * yt + (1-a) * St-1 式中,
St:时间t的平滑值;
yt:时间t的实际值;
St-1:时间t-1的平滑值;
假设以下数据:
如果仅有从y1开始的数据,那么确定初始值的方法有:
1)取S0等于y1;
2)待积累若干数据后,取S1等于前面若干数据的简单算术平均数,如:S1=(y1+ y2+y3)/3等等。
这里取前三号的平均值,以*a *= 0.5的一次指数平滑值计算为例,有
构建的预测模型如下,
当时间数列无明显的趋势变化,可用一次指数平滑预测。其预测公式为:
yt+1'=a * yt+(1-a) * yt' 式中
那么,预测 S16 = 0.5 * 28.06 + 29 * 0.5 = 28.53
这里我我们尝试不同的权重值a ,看看平滑曲线呈现什么样的走势。
当 权重值a 越小,曲线的平滑作用越强,对数据的起伏程度越小。
二次指数平滑预测
指数平滑值序列出现一定的滞后偏差的程度随着权系数(平滑系数)的增大而减少;但当时间序列的变动出现直线趋势时,用一次指数平滑法来进行预测仍将存在着明显的滞后偏差。因此,也需要进行修正。
在一次指数平滑的基础上得二次指数平滑 的计算公式为:
St(2) = a * St(1) + (1 - a) * St-1(2)
St(2): 第t周期的二次指数平滑值;
St(1): 第t周期的一次指数平滑值;
St-1(2): 第t-1周期的二次指数平滑值;
a: 加权系数(也称为平滑系数)。
数学模型为
Y t+T : 预测曲线
T: 离间隔t 的数
二次平滑实验 - 平滑函数
def func(data, a):
se = []
for i in range(len(data)):
pre = 0.;
if not i == 0:
pre = a * data[i] + (1-a) * se[i-1]
else:
pre = (1-a) * (data[0] + data[1] + data[2]) / 3 + a * data[i]
se.append(round(pre,2))
return se
三次指数平滑预测
若时间序列的变动呈现出二次曲线趋势,则需要采用三次指数平滑法进行预测。
平滑公式为:
St(3) = a * St(2) + (1 - a) * St-1(3)
预测公式:
预测结果实验如下
总结:
一次指数平滑预测: 时间数列无明显的趋势变化
二次指数平滑预测:适用于具线性趋势的时间数列
三次指数平滑预测 :时间序列的变动呈现出二次曲线趋势
参考资料:
1.http://wiki.mbalib.com/wiki/%E6%8C%87%E6%95%B0%E5%B9%B3%E6%BB%91%E6%B3%95
2.https://baike.baidu.com/item/%E6%8C%87%E6%95%B0%E5%B9%B3%E6%BB%91%E6%B3%95/8726217?fr=aladdin
3.http://blog.csdn.net/nieson2012/article/details/51980943
jupyter实验过程代码:
链接: https://pan.baidu.com/s/1i6WLH6t 密码: sbnb