灰色预测模型
主要特点是模型使用的不是原始数据序列,而是生成的数据序列,核心体系为灰色模型(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])