指数平滑算法(1)-简单指数平滑(python)

指数平滑算法是一种应用广泛的时间序列算法,在一般情况下,时间序列的数值变化规律有以下四种如图1,不同的指数平滑算法应用于不同的变化规律,本文章重点讲解“简单指数平滑”,其适用于无长期变动规律,无季节变动规律的情况。

图1

 那什么是无长期变动规律,无季节变动规律呢?我们举个例子。如下图,总体趋势是不断递增的,这说明数据具有长期变动趋势,也就是从长远来的趋势。如果在一年中都有在特定的月份中销售量很高或很低,表现出的规律为季节变动规律,季节变动规律一般以年为区间中的月份为考查重点。

 时间序列预测要求我们根据过去的观测值从而预测未来的数据,预测是使用加权平均值计算的,其中权重随着过去的观测值呈指数级下降 — 最小的权重与最早的观测值相关联。简单来说,越新的数据对未来的影响更大,越旧的数据对未来的影响更小。对最近的观测结果给予更大的权重,而不是对遥远过去的观测结果给予更大的权重可能是明智的。

简单指数平滑法的公式如下:

Y`t+1 = a*Yt + (1-t)*Y`t

其中Y`t+1--t+1期的预测值;Yt--t期的实际值;Y`t--t期的预测值;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  的增大而减少,但当时间序列的变动出现直线趋势时,用一次指数平滑法来进行预测仍将存在着明显的滞后偏差,需要二次指数平滑来解决。如果本文对你有帮助,就多多支持,后续会继续更新指数平滑的指数讲解。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值