您好,登錄后才能下訂單哦!
指數平滑法
其實我想說自己百度的…
只有懂的人才會找到這篇文章…
不懂的人…看了我的文章…還是不懂哈哈哈
指數平滑法相比于移動平均法,它是一種特殊的加權平均方法。簡單移動平均法用的是算術平均數,近期數據對預測值的影響比遠期數據要大一些,而且越近的數據影響越大。指數平滑法正是考慮了這一點,并將其權值按指數遞減的規律進行分配,越接近當前的數據,權重越大;反之,遠離當前的數據,其權重越小。指數平滑法按照平滑的次數,一般可分為一次指數平滑法、二次指數平滑法和三次指數平滑法等。然而一次指數平滑法適用于無趨勢效應、呈平滑趨勢的時間序列的預測和分析,二次指數平滑法多適用于呈線性變化的時間序列預測。
具體公式還是百度吧…
材料
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 (rlalan@outlook.com) # @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, 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)#建立預測軸 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), 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構建指數平滑預測模型示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。