当前位置: 首页 > 科技观察

Python时间序列预测:Hot-winters_0

时间:2023-03-12 09:31:13 科技观察

Python中文社区(ID:python-china)1、什么是Holt-Winters时间序列是一种很常见的数据格式,以[时间,观测值]的形式表示,如如下图所示。在真实场景中,比如股票走势图,国家历年GDP数据,机器cpu利用率,内存数据等都是时间序列。预测未来的观测值是有意义的。如果提前预测未来数据的趋势,就可以提前采取行动,比如预测cpu的使用率。如果cpu飙升,可以提早调整,避免机器负载过大而Downtime,这是AIOPS中很常见的应用场景。今天要讲的是Holt-Winters,它使用三次指数平滑来做时间序列预测。Holt-Winters是结合了1957年的Holt和1960年的Winters的思想的一种方法。我们来看看指数平滑。指数平滑如下图所示:可以看出,si表示第i时刻平滑后的估计值,si可以表示为当前实际值xi与前一时刻平滑后的估计值的加权组合矩,权重由alpha决定。那么为什么叫指数平滑呢?让我们对公式进行展开,如下:有点类似于泰勒展开。Alpha属于[0,1],越大表示越近的数据影响越大。二次指数平滑:加上趋势因子,一次指数平滑,不考虑序列的时间趋势和季节性,二次指数平滑加上趋势因子。从公式可以看出,时间序列的矩值被分解为基线部分和趋势部分,t代表趋势,可以表示为连续两个矩的差值;可见ti也是指数平滑。Holt-Winters三重指数平滑:在二次指数平滑的基础上加上季节因素,考虑季节因素,就是三重指数平滑,即Holt-Winters。因此,时间序列的矩值被分解为基线部分、趋势部分和季节部分。由于季节性,有周期性,如每周、每月等。pi季节性是当前季节性值和上一时期估计季节性的加权组合,周期在公式中用k表示。如下:2.Holt-Winters的实现从第一部分我们可以知道,要实现Holt-Winters,我们只需要知道:?初始值:s0,t0和p0?合适的参数:alpha,beta,gamma?插入公式完成预测三个重要的参数:alpha,beta,gamma都在[0,1]之间,要么是人为搜索,要么是通过数据估计,通常使用L-BFGS优化算法来拟合数据。优化算法来自包scipy.optimize的fmin_l_bfgs_b。来自__future__importDivisionfromSimportExitFromthimateSqromnumpyImportarayFromScipy.optimizeimizeimizeimizeimizeimizeimizeimizeImportfmin_l_bfgs_b#2]a=[总和(Y[0:m])/浮动(m)]b=[(总和(Y[m:2*m])-总和(Y[0:m]))/m**2]iftype=='additive':s=[Y[i]-a[0]foreignrange(m)]y=[a[0]+b[0]+s[0]]foreignrange(len(Y);;):a.append(alpha*(Y[i]-s[i])+(1-alpha)*(a[i]+b[i]))b.append(beta*(a[i+).1).]-a[i])+(1-beta)*b[i])s.append(gamma*(Y[i]-a[i]-b[i])+(1-gamma)*s[i])y.append(a[i+1]+b[i+1]+s[i+1])rmse=sqrt(sum([(m-n)**2form,ninzip(Y,y).[:-1])])/len(Y))returncurrency#defadditivevalues(x,m,fc,alpha=None,beta=None,gamma=None):Y=x[:]#默认fmin_l_bfgs_b返回alphabetaforgammaif(alpha==Noneorbeta==Noneorgamma==None):initial_values=array([0.3,0.1,0.1])boundaries=[(0,1),(0,1),(0,1)]type='additive'parameters=fmin_l_bfgs_b(RMSE,x0=initial_values,args=(Y,type,m),bounds=boundaries,approx_degree=True)alpha,beta,gamma=参数rs[0]#初始值a表示基线,b表示趋势,s表示季节性,y表示预测值,分别取第一个周期的统计数据作为初始值a=[sum(Y[0:m])/float(m)]b=[(sum(Y[m:2*m])-sum(Y[0:m]))/m**2]s=[Y[i]-a[0]foriinrange(m)]y=[a[0]+b[0]+s[0]]rmse=0#套用上面的公式,从0开始,fc代表预测的次数,比如前7天,预测下一个小时的数据,如果数据粒度为5分钟,fc为12foriinrange(len(Y)+fc):ifi==len(Y):#predictedvalueisY.append(a[-1]+b[-1]+s[-m])a.append(alpha*(Y[i]-s[i])+(1-alpha)*(a[i]+b[i]))b.append(beta*(a[i+1]-a[i])+(1-beta)*b[i])s.append(gamma*(Y[i]-a[i]-b[i])+(1-gamma)*s[i])y.append(a[i+1]+b[i+1]+s[i+1])#计算rmse值rmse=sqrt(sum([(m-n)**2form,ninzip(Y[:-fc],y[:-fc-1])])/len(Y[:-fc]))returny[-fc:],alpha,beta,gamma,rmse另外,statsmodels包中也提供了实现方法来自statsmodels.tsa.holtwintersimportExponentialSm舒缓3。Holt-Wintersparameters从上面的实现可以看出,holt-winters是通过估计alpha、beta和gamma来预测的。算法的关键就是这三个参数和初始化值。这三个参数可以通过优化算法进行估计,但不一定是最优的。除了上述统计值外,初始值的设置也可以通过时间序列分解的趋势和季节部分进行初始化。importnumpyasnpfrompandasimportread_csvimportmatplotlib.pyplotaspltfromstatsmodels.tsa.seasonalimportseasonal_decomposedecomposition=seasonal_decompose(df_clean.bw,model='additive',period=288)decomposition.plot()Holt-Winters对于波形比较稳定,没有尖峰效果会更好。对于尖峰的存在,统一的alpha、beta和gamma不能很好地拟合,预测可能会滞后。4.总结本文分享了时间序列预测算法Holt-Winters以及重要参数的选取。希望对您有所帮助。总结如下:?Holt-Winters是三次指数平滑,分别是baseline、trend和seasonality;?alpha,beta,gamma分别是baseline,trend,seasonality的指数加权参数,一般通过优化算法L-BFGS估计?初始化可以通过平均值或者时间序列分解得到?周期m或k的选择应根据实际数据选择?Holt-Winters波形比较稳定,没有尖峰时效果会更好