python構(gòu)建指數(shù)平滑預(yù)測模型示例
指數(shù)平滑法
其實(shí)我想說自己百度的…
只有懂的人才會(huì)找到這篇文章…
不懂的人…看了我的文章…還是不懂哈哈哈
指數(shù)平滑法相比于移動(dòng)平均法,它是一種特殊的加權(quán)平均方法。簡單移動(dòng)平均法用的是算術(shù)平均數(shù),近期數(shù)據(jù)對預(yù)測值的影響比遠(yuǎn)期數(shù)據(jù)要大一些,而且越近的數(shù)據(jù)影響越大。指數(shù)平滑法正是考慮了這一點(diǎn),并將其權(quán)值按指數(shù)遞減的規(guī)律進(jìn)行分配,越接近當(dāng)前的數(shù)據(jù),權(quán)重越大;反之,遠(yuǎn)離當(dāng)前的數(shù)據(jù),其權(quán)重越小。指數(shù)平滑法按照平滑的次數(shù),一般可分為一次指數(shù)平滑法、二次指數(shù)平滑法和三次指數(shù)平滑法等。然而一次指數(shù)平滑法適用于無趨勢效應(yīng)、呈平滑趨勢的時(shí)間序列的預(yù)測和分析,二次指數(shù)平滑法多適用于呈線性變化的時(shí)間序列預(yù)測。
具體公式還是百度吧…
材料
1.python3.5
2.numpy
3.matplotlib
4.國家社科基金1995-2015年立項(xiàng)數(shù)據(jù)
需求
預(yù)測2016年和2017年國家社科基金項(xiàng)目立項(xiàng)數(shù)量
數(shù)據(jù)
#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 #指數(shù)平滑公式 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 #繪制預(yù)測曲線 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)#設(shè)置繪圖區(qū)域的大小和像素 plt.plot(year, number, color='blue', label="actual value")#將實(shí)際值的折線設(shè)置為藍(lán)色 plt.plot(new_year[1:], s_pre_double[2:],color='red', label="double predicted value")#將二次指數(shù)平滑法計(jì)算的預(yù)測值的折線設(shè)置為紅色 plt.plot(new_year[1:], s_pre_triple[2:],color='green', label="triple predicted value")#將三次指數(shù)平滑法計(jì)算的預(yù)測值的折線設(shè)置為綠色 plt.legend(loc='lower right')#顯示圖例的位置,這里為右下方 plt.title('Projects') plt.xlabel('year')#x軸標(biāo)簽 plt.ylabel('number')#y軸標(biāo)簽 plt.xticks(new_year)#設(shè)置x軸的刻度線為new_year plt.show() def main(): alpha = .70#設(shè)置alphe,即平滑系數(shù) pre_year = np.array([2016, 2017])#將需要預(yù)測的兩年存入numpy的array對象里 data_path = r'data1.txt'#設(shè)置數(shù)據(jù)路徑 data = np.loadtxt(data_path)#用numpy讀取數(shù)據(jù) year, time_id, number = data.T#將數(shù)據(jù)分別賦值給year, time_id, number initial_line = np.array([0, 0, number[0]])#初始化,由于平滑指數(shù)是根據(jù)上一期的數(shù)值進(jìn)行預(yù)測的,原始數(shù)據(jù)中的最早數(shù)據(jù)為1995,沒有1994年的數(shù)據(jù),這里定義1994年的數(shù)據(jù)和1995年數(shù)據(jù)相同 initial_data = np.insert(data, 0, values=initial_line, axis=0)#插入初始化數(shù)據(jù) initial_year, initial_time_id, initial_number = initial_data.T#插入初始化年 s_single = exponential_smoothing(alpha, initial_number)#計(jì)算一次指數(shù)平滑 s_double = exponential_smoothing(alpha, s_single)#計(jì)算二次平滑字?jǐn)?shù),二次平滑指數(shù)是在一次指數(shù)平滑的基礎(chǔ)上進(jìn)行的,三次指數(shù)平滑以此類推 a_double = 2*s_single-s_double#計(jì)算二次指數(shù)平滑的a b_double = (alpha/(1-alpha))*(s_single-s_double)#計(jì)算二次指數(shù)平滑的b s_pre_double = np.zeros(s_double.shape)#建立預(yù)測軸 for i in range(1, len(initial_time_id)): s_pre_double[i] = a_double[i-1]+b_double[i-1]#循環(huán)計(jì)算每一年的二次指數(shù)平滑法的預(yù)測值,下面三次指數(shù)平滑法原理相同 pre_next_year = a_double[-1]+b_double[-1]*1#預(yù)測下一年 pre_next_two_year = a_double[-1]+b_double[-1]*2#預(yù)測下兩年 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)#組合預(yù)測值 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)#傳入預(yù)測值和數(shù)據(jù) if __name__ == '__main__': main()
預(yù)測結(jié)果
以上這篇python構(gòu)建指數(shù)平滑預(yù)測模型示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
用Python進(jìn)行簡單圖像識別(驗(yàn)證碼)
這篇文章主要為大家詳細(xì)介紹了用Python進(jìn)行簡單圖像識別驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01python smtplib發(fā)送多個(gè)email聯(lián)系人的實(shí)現(xiàn)
這篇文章主要介紹了python smtplib發(fā)送多個(gè)email聯(lián)系人的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用
csv文件是一種逗號分隔的純文本形式存儲(chǔ)的表格數(shù)據(jù),Python內(nèi)置了CSV模塊,可直接通過該模塊實(shí)現(xiàn)csv文件的讀寫操作,下面這篇文章主要給大家介紹了關(guān)于Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用,需要的朋友可以參考下2022-09-09Python畫圖工具M(jìn)atplotlib庫常用命令簡述
這篇文章主要介紹了Python畫圖Matplotlib庫常用命令簡述總結(jié),文中包含詳細(xì)的圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Python3爬蟲學(xué)習(xí)之爬蟲利器Beautiful Soup用法分析
這篇文章主要介紹了Python3爬蟲學(xué)習(xí)之爬蟲利器Beautiful Soup用法,結(jié)合實(shí)例形式分析了Beautiful Soup的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-12-12利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))
這篇文章主要給大家介紹了關(guān)于利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2018-03-03關(guān)于Python函數(shù)對象的名稱空間和作用域
這篇文章主要介紹了關(guān)于Python函數(shù)對象的名稱空間和作用域,數(shù)據(jù)的名稱是儲(chǔ)存到棧區(qū),而數(shù)據(jù)的內(nèi)容是儲(chǔ)存到堆區(qū),當(dāng)我們要去使用數(shù)據(jù)的內(nèi)容時(shí),我們可以通過數(shù)據(jù)的名稱來直接去表示數(shù)據(jù)的內(nèi)容,需要的朋友可以參考下2023-04-04