预测方法——灰色预测模型


灰色预测模型

主要特点是模型使用的不是原始数据序列,而是生成的数据序列,核心体系为灰色模型(GM),即对原始数据作做累加生成(累减生成,加权邻值生成)得到近似指数规律再进行建模。

优点:不需要很多数据;将无规律原始数据进行生成得到规律性较强的生成序列。

缺点:只适用于中短期预测,只适合指数增长的预测。

GM(1,1)预测模型

GM(1,1)模型是一阶微分方程,且只含一个变量。

  1. 模型预测方法

  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使得数据列的级比都落在可容覆盖内。

    2. 建立模型

      根据1中方程的解,进一步推断出预测值

      \[\hat{x}^{(1)}(k+1)=(x^{(0)}(1)-\frac{b}{a})e^{-ak}+\frac{b}{a}\quad ,k=1,2,...,n-1 \]

    3. 检验预测值

      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,则认为达到一般要求。

      2. 级比偏差值检验

        \[\rho(k)=1-\frac{1-0.5a}{1+0.5a}\lambda(k) \]

        如果对所有的|ρ(k)|<0.1,则认为达到较高的要求;否则,若对于所有的|ρ(k)|<0.2,则认为达到一般要求。

    4. 预测预报

      根据问题需要给出预测预报。

  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])


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM