python構建指數(shù)平滑預測模型示例
指數(shù)平滑法
其實我想說自己百度的…
只有懂的人才會找到這篇文章…
不懂的人…看了我的文章…還是不懂哈哈哈
指數(shù)平滑法相比于移動平均法,它是一種特殊的加權平均方法。簡單移動平均法用的是算術平均數(shù),近期數(shù)據(jù)對預測值的影響比遠期數(shù)據(jù)要大一些,而且越近的數(shù)據(jù)影響越大。指數(shù)平滑法正是考慮了這一點,并將其權值按指數(shù)遞減的規(guī)律進行分配,越接近當前的數(shù)據(jù),權重越大;反之,遠離當前的數(shù)據(jù),其權重越小。指數(shù)平滑法按照平滑的次數(shù),一般可分為一次指數(shù)平滑法、二次指數(shù)平滑法和三次指數(shù)平滑法等。然而一次指數(shù)平滑法適用于無趨勢效應、呈平滑趨勢的時間序列的預測和分析,二次指數(shù)平滑法多適用于呈線性變化的時間序列預測。
具體公式還是百度吧…
材料
1.python3.5
2.numpy
3.matplotlib
4.國家社科基金1995-2015年立項數(shù)據(jù)
需求
預測2016年和2017年國家社科基金項目立項數(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
#繪制預測曲線
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)#設置繪圖區(qū)域的大小和像素
plt.plot(year, number, color='blue', label="actual value")#將實際值的折線設置為藍色
plt.plot(new_year[1:], s_pre_double[2:],color='red', label="double predicted value")#將二次指數(shù)平滑法計算的預測值的折線設置為紅色
plt.plot(new_year[1:], s_pre_triple[2:],color='green', label="triple predicted value")#將三次指數(shù)平滑法計算的預測值的折線設置為綠色
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,即平滑系數(shù)
pre_year = np.array([2016, 2017])#將需要預測的兩年存入numpy的array對象里
data_path = r'data1.txt'#設置數(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ù)值進行預測的,原始數(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)#計算一次指數(shù)平滑
s_double = exponential_smoothing(alpha, s_single)#計算二次平滑字數(shù),二次平滑指數(shù)是在一次指數(shù)平滑的基礎上進行的,三次指數(shù)平滑以此類推
a_double = 2*s_single-s_double#計算二次指數(shù)平滑的a
b_double = (alpha/(1-alpha))*(s_single-s_double)#計算二次指數(shù)平滑的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]#循環(huán)計算每一年的二次指數(shù)平滑法的預測值,下面三次指數(shù)平滑法原理相同
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)#傳入預測值和數(shù)據(jù)
if __name__ == '__main__':
main()
預測結果


以上這篇python構建指數(shù)平滑預測模型示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Pygame實現(xiàn)游戲最小系統(tǒng)功能詳解
這篇文章主要介紹了Pygame實現(xiàn)游戲最小系統(tǒng),Pygame是一個專門用來開發(fā)游戲的 Python 模塊,主要為開發(fā)、設計 2D 電子游戲而生,具有免費、開源,支持多種操作系統(tǒng),具有良好的跨平臺性等優(yōu)點2022-11-11
在python中l(wèi)ogger setlevel沒有生效的解決
今天小編就為大家分享一篇在python中l(wèi)ogger setlevel沒有生效的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python開發(fā)中range()函數(shù)用法實例分析
這篇文章主要介紹了python開發(fā)中range()函數(shù)用法,以實例形式較為詳細的分析了Python中range()函數(shù)遍歷列表的相關技巧,需要的朋友可以參考下2015-11-11
Python基于pygame實現(xiàn)的font游戲字體(附源碼)
這篇文章主要介紹了Python基于pygame實現(xiàn)的font游戲字體,涉及Python響應鍵盤按鍵動態(tài)操作圖片元素的相關技巧,需要的朋友可以參考下2015-11-11
Python 利用Entrez庫篩選下載PubMed文獻摘要的示例
這篇文章主要介紹了Python 利用Entrez庫篩選下載PubMed文獻摘要的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11

