灰色預測模型
主要特點是模型使用的不是原始數據序列,而是生成的數據序列,核心體系為灰色模型(GM),即對原始數據作做累加生成(累減生成,加權鄰值生成)得到近似指數規律再進行建模。
優點:不需要很多數據;將無規律原始數據進行生成得到規律性較強的生成序列。
缺點:只適用於中短期預測,只適合指數增長的預測。
GM(1,1)預測模型
GM(1,1)模型是一階微分方程,且只含一個變量。
-
模型預測方法


-
模型預測步驟
-
數據檢驗與處理
為保證建模方法可行,需要對已知數據做必要的檢驗處理。
設原始數據列為
\[x^{(0)}= (x^{0}(1),x^{0}(2),….x^{0}(n)) \],計算數列的級比
\[\lambda(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)}\quad,k=2,3,...,n \]如果所有的級比都落在可容覆蓋區間
\[X=(e^{\frac{-2}{n+1}},e^{\frac{2}{n+1}}) \]內,則數列 可以建立GM(1,1)模型且可以進行灰色預測。否則,對數據做適當的變換處理,如平移變換:
\[y^{(0)}(k)=x{(0)}(k)+c\quad,k=1,2,...,n \]取c使得數據列的級比都落在可容覆蓋內。
-
建立模型
根據1中方程的解,進一步推斷出預測值
\[\hat{x}^{(1)}(k+1)=(x^{(0)}(1)-\frac{b}{a})e^{-ak}+\frac{b}{a}\quad ,k=1,2,...,n-1 \] -
檢驗預測值
-
殘差檢驗
\[\varepsilon(k)=\frac{x^{(0)}(k)-\hat{x}^{(0)}(k)}{x^{(0)}(k)}\quad,k=1,2,...,n \]如果對所有的|ε(k)|<0.1|ε(k)|<0.1,則認為到達較高的要求;否則,若對所有的|ε(k)|<0.2|ε(k)|<0.2,則認為達到一般要求。
-
級比偏差值檢驗
\[\rho(k)=1-\frac{1-0.5a}{1+0.5a}\lambda(k) \]如果對所有的|ρ(k)|<0.1,則認為達到較高的要求;否則,若對於所有的|ρ(k)|<0.2,則認為達到一般要求。
-
-
預測預報
根據問題需要給出預測預報。
-
-
py實現
import numpy as np import pandas as pd data=[71.1,72.4,72.4,72.1,71.4,72.0,71.6] # 數據來源 len=len(data) # 數據量 # 數據檢驗 lambdas=[] for i in range(1,len): lambdas.append(data[i-1]/data[i]) X_Min=np.e**(-2/(len+1)) X_Max=np.e**(2/(len+1)) l_min,l_max=min(lambdas),max(lambdas) if l_min<X_Min or l_max> X_Max: print("該組數據為通過數據檢驗,不能建立GM模型!") else: print("改組數據通過檢驗") # 建立GM(1,1)模型 data_1=[] # 累加數列 z_1=[] data_1.append(data[0]) for i in range(1,len): data_1.append(data[i]+data_1[i-1]) z_1.append(-0.5*(data_1[i]+data_1[i-1])) B=np.array(z_1).reshape(len-1,1) one=np.ones(len-1) B=np.c_[B,one] Y=np.array(data[1:]).reshape(len-1,1) a,b=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y) print('a='+str(a)) print('b='+str(b)) ## 數據預測 data_1_prd=[] data_1_prd.append(data[0]) data_prd=[] # 預測data data_prd.append(data[0]) for i in range(1,len): data_1_prd.append((data[0]-b/a)*np.e**(-a*i)+b/a) data_prd.append(data_1_prd[i]-data_1_prd[i-1]) # 模型檢驗 ## 殘差檢驗 e=[] for i in range(len): e.append((data[i]-data_prd[i])/data[i]) e_max=max(e) if e_max<0.1: print("數據預測達到較高要求!") elif e_max<0.2: print("數據預測達到一般要求!") # 輸出預測數據 for i in range(len): print(data_prd[i])灰色Verhulst預測模型
主要用於描述具有飽和狀體的過程,即S型過程,常用於人口預測,生物生長,繁殖預測及產品經濟壽命預測等。
基本原理



py代碼實現
import numpy as np
data=[4.93,2.33,3.87,4.35,6.63,7.15,5.37,6.39,7.81,8.35] # 原始數據
len=len(data)
data_1=[] # 累加數列
z_1=[]
data_1.append(data[0])
for i in range(1,len):
data_1.append(data[i]+data_1[i-1])
z_1.append(-0.5*(data_1[i]+data_1[i-1]))
B=np.array(z_1).reshape(len-1,1)
B_=B**2
B=np.c_[B,B_]
Y=np.array(data[1:]).reshape(len-1,1)
a,b=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y)
print('a='+str(a))
print('b='+str(b))
data_1_prd=[]
data_1_prd.append(data[0])
data_prd=[] # 預測data
data_prd.append(data[0])
for i in range(1,len):
data_1_prd.append(a*data[0]/(b*data[0]+(a-b*data[0])*np.e**(a*i)))
data_prd.append(data_1_prd[i]-data_1_prd[i-1])
## 數據預測值
for i in range(len):
print(data_prd[i])
## 預測值誤差
e=[]
for i in range(len):
e.append(100*(data[i]-data_prd[i])/data[i])
print(e[i])
