1. 程式人生 > 程式設計 >python構建指數平滑預測模型示例

python構建指數平滑預測模型示例

指數平滑法

其實我想說自己百度的…

只有懂的人才會找到這篇文章…

不懂的人…看了我的文章…還是不懂哈哈哈

指數平滑法相比於移動平均法,它是一種特殊的加權平均方法。簡單移動平均法用的是算術平均數,近期資料對預測值的影響比遠期資料要大一些,而且越近的資料影響越大。指數平滑法正是考慮了這一點,並將其權值按指數遞減的規律進行分配,越接近當前的資料,權重越大;反之,遠離當前的資料,其權重越小。指數平滑法按照平滑的次數,一般可分為一次指數平滑法、二次指數平滑法和三次指數平滑法等。然而一次指數平滑法適用於無趨勢效應、呈平滑趨勢的時間序列的預測和分析,二次指數平滑法多適用於呈線性變化的時間序列預測。

具體公式還是百度吧…

材料

1.python3.5

2.numpy

3.matplotlib

4.國家社科基金1995-2015年立項資料

需求

預測2016年和2017年國家社科基金專案立項數量

資料

#year time_id number
1994 1 10
1995 2 3
1996 3 27
1997 4 13
1998 5 12
1999 6 13
2000 7 14
2001 8 23
2002 9 32
2003 10 30
2004 11 36
2005 12 40
2006 13 58
2007 14 51
2008 15 73
2009 16 80
2010 17 106
2011 18 127
2012 19 135
2013 20 161
2014 21 149
2015 22 142

程式碼

# -*- coding: utf-8 -*-
# @Date  : 2017-04-11 21:27:00
# @Author : Alan Lau ([email protected])
# @Language : Python3.5

import numpy as np
from matplotlib import pyplot as plt

#指數平滑公式
def exponential_smoothing(alpha,s):
 s2 = np.zeros(s.shape)
 s2[0] = s[0]
 for i in range(1,len(s2)):
  s2[i] = alpha*s[i]+(1-alpha)*s2[i-1]
 return s2

#繪製預測曲線
def show_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="actual value")#將實際值的折線設定為藍色
 plt.plot(new_year[1:],s_pre_double[2:],color='red',label="double predicted value")#將二次指數平滑法計算的預測值的折線設定為紅色
 plt.plot(new_year[1:],s_pre_triple[2:],color='green',label="triple predicted value")#將三次指數平滑法計算的預測值的折線設定為綠色
 plt.legend(loc='lower right')#顯示圖例的位置,這裡為右下方
 plt.title('Projects')
 plt.xlabel('year')#x軸標籤
 plt.ylabel('number')#y軸標籤
 plt.xticks(new_year)#設定x軸的刻度線為new_year
 plt.show()


def main():
 alpha = .70#設定alphe,即平滑係數
 pre_year = np.array([2016,2017])#將需要預測的兩年存入numpy的array物件裡
 data_path = r'data1.txt'#設定資料路徑
 data = np.loadtxt(data_path)#用numpy讀取資料
 year,number = data.T#將資料分別賦值給year,number
 initial_line = np.array([0,number[0]])#初始化,由於平滑指數是根據上一期的數值進行預測的,原始資料中的最早資料為1995,沒有1994年的資料,這裡定義1994年的資料和1995年資料相同
 initial_data = np.insert(data,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)#建立預測軸
 for i in range(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)

 for i in range(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),axis=0)

 new_year = np.insert(year,len(year),values=pre_year,axis=0)
 output = np.array([new_year,s_pre_triple])
 print(output)
 show_data(new_year,s_pre_triple)#傳入預測值和資料


if __name__ == '__main__':
 main()

預測結果

程式碼及資料

以上這篇python構建指數平滑預測模型示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。