預測方法——灰色預測模型


灰色預測模型

主要特點是模型使用的不是原始數據序列,而是生成的數據序列,核心體系為灰色模型(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