1.先上代码:
import numpy as npdef secondaryExponentialSmoothingMethod(list,n_average,alpha,day): # 参数list为你要传入的时间序列,n_average表示数列两端取多少个数(要取奇数),alpha为平滑系数,day为向后预测的天数# 准备好解二元一次方程组的方法def fangChengZu(a1,b1,a2,b2,c1,c2):a = np.array([[a1,b1],[a2,b2]])b = np.array([c1,c2])x,y = np.linalg.solve(a,b)return x,y# 取数列两端各n_average个值加以平均list_left = list[0:n_average] # data中前n_average个值构成的listlist_right = list[n_average+1:len(list)] # data中后n_average个值构成的listlist_left_average = np.mean(list_left) # list_left包含元素的均值list_right_average = np.mean(list_right)x1 = (n_average+1)/2x2 = (len(list) - x1) + 1# print(list_left_average,list_right_average)# 代入线性趋势方程,解出a1,b1a1,b1 = fangChengZu(1,x1,1,x2,list_left_average,list_right_average)# print(a1,b1)# 代入公式(12),解出S11,S12S11, S12 = fangChengZu(2,-1,a1,b1,-b1,(alpha/(1-alpha)))# print(S11,S12)a_tao = 0 # 初始化b_tao = 0for i in range(len(list)):S1 = alpha*list[i] + (1-alpha)*S11S2 = alpha*S1 + (1-alpha)*S12S11 = S1S12 = S2a_tao = 2*S1-S2b_tao = (alpha/(1-alpha))/(S1-S2)H = a_tao + b_tao * day # 预测值return Hif __name__ == '__main__':data = [0, 1, 2, 3, 4, 5, 6, 7] # 时间序列prediction_day1 = secondaryExponentialSmoothingMethod(data, 3, 0.5, 1)prediction_day2 = secondaryExponentialSmoothingMethod(data, 3, 0.5, 2)print(prediction_day1,prediction_day2)
2.运行结果
8.01043049217316 和 9.054689109346318
3.代码讲解
本人参考论文:王长江. 指数平滑法中平滑系数的选择研究[J]. 中北大学学报(自然科学版), , 27(06):558-561.进行python代码编写
Step1:首先在你传入的时间序列data两端取若干值加以平均,代入线性趋势方程:
Step2:上述公式可解出a1,b1,再代入如下公式解出初始一、二指数平滑值S11,S12
Step3:根据初始平滑值不断计算下一期(天)的一二指数平滑值,计算公式如下:
Step4:再利用上述公式进行迭代的过程中,还要利用第二个公式不断更新模型参数a_tao,b_tao,因此,预测时间第tao+d天的值为:
如有误,希望批评指正。