python构建指数平滑预测模型示例
指数平滑法
其实我想说自己百度的…
只有懂的人才会找到这篇文章…
不懂的人…看了我的文章…还是不懂哈哈哈
指数平滑法相比于移动平均法,它是一种特殊的加权平均方法。简单移动平均法用的是算术平均数,近期数据对预测值的影响比远期数据要大一些,而且越近的数据影响越大。指数平滑法正是考虑了这一点,并将其权值按指数递减的规律进行分配,越接近当前的数据,权重越大;反之,远离当前的数据,其权重越小。指数平滑法按照平滑的次数,一般可分为一次指数平滑法、二次指数平滑法和三次指数平滑法等。然而一次指数平滑法适用于无趋势效应、呈平滑趋势的时间序列的预测和分析,二次指数平滑法多适用于呈线性变化的时间序列预测。
具体公式还是百度吧…
材料
1.python3.5
2.numpy
3.matplotlib
4.国家社科基金1995-2015年立项数据
需求
预测2016年和2017年国家社科基金项目立项数量
数据
#yeartime_idnumber 1994110 199523 1996327 1997413 1998512 1999613 2000714 2001823 2002932 20031030 20041136 20051240 20061358 20071451 20081573 20091680 201017106 201118127 201219135 201320161 201421149 201522142
代码
#-*-coding:utf-8-*- #@Date:2017-04-1121:27:00 #@Author:AlanLau(rlalan@outlook.com) #@Language:Python3.5 importnumpyasnp frommatplotlibimportpyplotasplt #指数平滑公式 defexponential_smoothing(alpha,s): s2=np.zeros(s.shape) s2[0]=s[0] foriinrange(1,len(s2)): s2[i]=alpha*s[i]+(1-alpha)*s2[i-1] returns2 #绘制预测曲线 defshow_data(new_year,pre_year,data,s_pre_double,s_pre_triple): year,time_id,number=data.T plt.figure(figsize=(14,6),dpi=80)#设置绘图区域的大小和像素 plt.plot(year,number,color='blue',label="actualvalue")#将实际值的折线设置为蓝色 plt.plot(new_year[1:],s_pre_double[2:],color='red',label="doublepredictedvalue")#将二次指数平滑法计算的预测值的折线设置为红色 plt.plot(new_year[1:],s_pre_triple[2:],color='green',label="triplepredictedvalue")#将三次指数平滑法计算的预测值的折线设置为绿色 plt.legend(loc='lowerright')#显示图例的位置,这里为右下方 plt.title('Projects') plt.xlabel('year')#x轴标签 plt.ylabel('number')#y轴标签 plt.xticks(new_year)#设置x轴的刻度线为new_year plt.show() defmain(): alpha=.70#设置alphe,即平滑系数 pre_year=np.array([2016,2017])#将需要预测的两年存入numpy的array对象里 data_path=r'data1.txt'#设置数据路径 data=np.loadtxt(data_path)#用numpy读取数据 year,time_id,number=data.T#将数据分别赋值给year,time_id,number initial_line=np.array([0,0,number[0]])#初始化,由于平滑指数是根据上一期的数值进行预测的,原始数据中的最早数据为1995,没有1994年的数据,这里定义1994年的数据和1995年数据相同 initial_data=np.insert(data,0,values=initial_line,axis=0)#插入初始化数据 initial_year,initial_time_id,initial_number=initial_data.T#插入初始化年 s_single=exponential_smoothing(alpha,initial_number)#计算一次指数平滑 s_double=exponential_smoothing(alpha,s_single)#计算二次平滑字数,二次平滑指数是在一次指数平滑的基础上进行的,三次指数平滑以此类推 a_double=2*s_single-s_double#计算二次指数平滑的a b_double=(alpha/(1-alpha))*(s_single-s_double)#计算二次指数平滑的b s_pre_double=np.zeros(s_double.shape)#建立预测轴 foriinrange(1,len(initial_time_id)): s_pre_double[i]=a_double[i-1]+b_double[i-1]#循环计算每一年的二次指数平滑法的预测值,下面三次指数平滑法原理相同 pre_next_year=a_double[-1]+b_double[-1]*1#预测下一年 pre_next_two_year=a_double[-1]+b_double[-1]*2#预测下两年 insert_year=np.array([pre_next_year,pre_next_two_year]) s_pre_double=np.insert(s_pre_double,len(s_pre_double),values=np.array([pre_next_year,pre_next_two_year]),axis=0)#组合预测值 s_triple=exponential_smoothing(alpha,s_double) a_triple=3*s_single-3*s_double+s_triple b_triple=(alpha/(2*((1-alpha)**2)))*((6-5*alpha)*s_single-2*((5-4*alpha)*s_double)+(4-3*alpha)*s_triple) c_triple=((alpha**2)/(2*((1-alpha)**2)))*(s_single-2*s_double+s_triple) s_pre_triple=np.zeros(s_triple.shape) foriinrange(1,len(initial_time_id)): s_pre_triple[i]=a_triple[i-1]+b_triple[i-1]*1+c_triple[i-1]*(1**2) pre_next_year=a_triple[-1]+b_triple[-1]*1+c_triple[-1]*(1**2) pre_next_two_year=a_triple[-1]+b_triple[-1]*2+c_triple[-1]*(2**2) insert_year=np.array([pre_next_year,pre_next_two_year]) s_pre_triple=np.insert(s_pre_triple,len(s_pre_triple),values=np.array([pre_next_year,pre_next_two_year]),axis=0) new_year=np.insert(year,len(year),values=pre_year,axis=0) output=np.array([new_year,s_pre_double,s_pre_triple]) print(output) show_data(new_year,pre_year,data,s_pre_double,s_pre_triple)#传入预测值和数据 if__name__=='__main__': main()
预测结果
代码及数据
以上这篇python构建指数平滑预测模型示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。