1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python 二次指数平滑法 预测

Python 二次指数平滑法 预测

时间:2023-08-13 19:16:01

相关推荐

Python 二次指数平滑法 预测

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天的值为:

如有误,希望批评指正。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。