一文詳解Python灰色預測模型實現(xiàn)示例
前言
博主參與過大大小小十次數(shù)學建模比賽,也獲得了不少建模獎項。對于一些小批量樣本數(shù)據(jù)去做預測或者是評估其規(guī)律性的話,比較適合的模型一般都是選擇灰色預測模型。該模型解釋性強而且易于理解,建模手段也比較簡單。在一些不確定是否存在相關標量或者是存在位置特征的時候,用灰色預測模型尤為明顯,牽扯太多變量時候可以以量曾量減的方式顯現(xiàn)其變化規(guī)律,是建模比較好用的算法和思路。但是首先我們要明白該模型的使用場景以及優(yōu)缺點才能更好的解釋建模的效果。故為接下來的美賽,我將把一些常用建模的模型和代碼補上。
一、模型理論
灰色預測模型是通過少量的、不完全的信息,建立數(shù)學模型做出預測的一種預測方法。是基于客觀事物的過去和現(xiàn)在的發(fā)展規(guī)律,借助于科學的方法對未來的發(fā)展趨勢和狀況進行描述和分析,并形成科學的假設和判斷。
我們稱信息完全未確定的系統(tǒng)為黑色系統(tǒng),稱信息完全確定的系統(tǒng)為白色系統(tǒng),灰色系統(tǒng)就是這介于這之間,一部分信息是已知的,另一部分信息是未知的,系統(tǒng)內各因素間有不確定的關系。
不知道大家知不知道白盒測試和黑盒測試,我們可以這樣通俗的理解,黑色系統(tǒng)就好比一個黑色的盒子你看不到里面裝著幾個小球,從里面拿出幾個小球或者是章魚都是未知數(shù)。而白色系統(tǒng)就像是透明的盒子,你能很清楚的看到里面是什么你想要拿什么出來拿多少個。而這個灰色系統(tǒng)介于他們之間,盒子是灰色的,只能模糊的看到一些小球,看不到幾個或者是有除了小球以外的其他東西。
灰色預測通過鑒別系統(tǒng)因素之間發(fā)展趨勢的相異程度,即進行關聯(lián)分析,并對原始數(shù)據(jù)進行生成處理來尋找系統(tǒng)變動的規(guī)律,生成有較強規(guī)律性的數(shù)據(jù)序列,然后建立相應的微分方程模型,從而預測事物未來發(fā)展趨勢的狀況。其用等時距觀測到的反映預測對象特征的一系列數(shù)量值構造灰色預測模型,預測未來某一時刻的特征量,或達到某一特征量的時間。
特點
- 用灰色數(shù)學處理不確定量,使之量化。
- 充分利用已知信息尋求系統(tǒng)的運動規(guī)律。
- 灰色系統(tǒng)理論能處理貧信息系統(tǒng)。
二、模型場景
1.預測種類
- 灰色時間序列預測;即用觀察到的反映預測對象特征的時間序列來構造灰色預測模型,預測未來某一時刻的特征量,或達到某一特征量的時間。
- 畸變預測;即通過灰色模型預測異常值出現(xiàn)的時刻,預測異常值什么時候出現(xiàn)在特定時區(qū)內。
- 系統(tǒng)預測;通過對系統(tǒng)行為特征指標建立一組相互關聯(lián)的灰色預測模型,預測系統(tǒng)中眾多變量間的相互協(xié)調關系的變化。
- 拓撲預測;將原始數(shù)據(jù)作曲線,在曲線上按定值尋找該定值發(fā)生的所有時點,并以該定值為框架構成時點序列,然后建立模型預測該定值所發(fā)生的時點。
2.適用條件
灰色預測模型可針對數(shù)量非常少(比如僅4個),數(shù)據(jù)完整性和可靠性較低的數(shù)據(jù)序列進行有效預測,其利用微分方程來充分挖掘數(shù)據(jù)的本質,建模所需信息少,精度較高,運算簡便,易于檢驗,也不用考慮分布規(guī)律或變化趨勢等。但灰色預測模型一般只適用于短期預測,只適合指數(shù)增長的預測,比如人口數(shù)量,航班數(shù)量,用水量預測,工業(yè)產值預測等。
三、建模流程
總體建模流程可以參考:

1.級比校驗

trong>數(shù)據(jù)累加和微分方程構造

3.系數(shù)求解

數(shù)據(jù)向量Y:

4.殘差檢驗與級比偏差檢驗

四、Python實例實現(xiàn)

我們通過得到的周數(shù)擁堵車輛數(shù)據(jù)進行測試:
import numpy as np
import pandas as pd
from decimal import *
import matplotlib.pyplot as plt
def Grade_ratio_test(X0):
lambds = [X0[i - 1] / X0[i] for i in range(1, len(X0))]
X_min = np.e ** (-2 / (len(X0) + 1))
X_max = np.e ** (2 / (len(X0) + 1))
for lambd in lambds:
if lambd < X_min or lambd > X_max:
print('該數(shù)據(jù)未通過級比檢驗')
return False
print('該數(shù)據(jù)通過級比檢驗')
return True
def model_train(X0_train):
#AGO生成序列X1
X1 = X0_train.cumsum()
Z= (np.array([-0.5 * (X1[k - 1] + X1[k]) for k in range(1, len(X1))])).reshape(len(X1) - 1, 1)
# 數(shù)據(jù)矩陣A、B
A = (X0_train[1:]).reshape(len(Z), 1)
B = np.hstack((Z, np.ones(len(Z)).reshape(len(Z), 1)))
# 求灰參數(shù)
a, u = np.linalg.inv(np.matmul(B.T, B)).dot(B.T).dot(A)
u = Decimal(u[0])
a = Decimal(a[0])
print("灰參數(shù)a:", a, ",灰參數(shù)u:", u)
return u,a
def model_predict(u,a,k,X0):
predict_function =lambda k: (Decimal(X0[0]) - u / a) * np.exp(-a * k) + u / a
X1_hat = [float(predict_function(k)) for k in range(k)]
X0_hat = np.diff(X1_hat)
X0_hat = np.hstack((X1_hat[0], X0_hat))
return X0_hat
'''
根據(jù)后驗差比及小誤差概率判斷預測結果
:param X0_hat: 預測結果
:return:
'''
def result_evaluate(X0_hat,X0):
S1 = np.std(X0, ddof=1) # 原始數(shù)據(jù)樣本標準差
S2 = np.std(X0 - X0_hat, ddof=1) # 殘差數(shù)據(jù)樣本標準差
C = S2 / S1 # 后驗差比
Pe = np.mean(X0 - X0_hat)
temp = np.abs((X0 - X0_hat - Pe)) < 0.6745 * S1
p = np.count_nonzero(temp) / len(X0) # 計算小誤差概率
print("原數(shù)據(jù)樣本標準差:", S1)
print("殘差樣本標準差:", S2)
print("后驗差比:", C)
print("小誤差概率p:", p)
if __name__ == '__main__':
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步驟一(替換sans-serif字體)
plt.rcParams['axes.unicode_minus'] = False # 步驟二(解決坐標軸負數(shù)的負號顯示問題)
# 原始數(shù)據(jù)X
data = pd.read_excel('./siwei_day_traffic.xlsx')
X=data[data['week_day']=='周五'].jam_num[:5].astype(float).values
print(X)
# 訓練集
X_train = X[:int(len(X) * 0.7)]
# 測試集
X_test = X[int(len(X) * 0.7):]
Grade_ratio_test(X_train) # 判斷模型可行性
a,u=model_train(X_train) # 訓練
Y_pred = model_predict(a,u,len(X),X) # 預測
Y_train_pred = Y_pred[:len(X_train)]
Y_test_pred = Y_pred[len(X_train):]
score_test = result_evaluate(Y_test_pred, X_test) # 評估
# 可視化
plt.grid()
plt.plot(np.arange(len(X_train)), X_train, '->')
plt.plot(np.arange(len(X_train)), Y_train_pred, '-o')
plt.legend(['負荷實際值', '灰色預測模型預測值'])
plt.title('訓練集')
plt.show()
plt.grid()
plt.plot(np.arange(len(X_test)), X_test, '->')
plt.plot(np.arange(len(X_test)), Y_test_pred, '-o')
plt.legend(['負荷實際值', '灰色預測模型預測值'])
plt.title('測試集')
plt.show()
總結
模型優(yōu)點:數(shù)據(jù)少且無明顯規(guī)律時可用,利用微分方程挖掘數(shù)據(jù)本質規(guī)律。
模型缺點:灰色預測只適合短期預測、指數(shù)增長的預測。
以上就是一文詳解Python灰色預測模型實現(xiàn)示例的詳細內容,更多關于Python灰色預測模型的資料請關注腳本之家其它相關文章!
相關文章
Python+OpenCV實現(xiàn)圖像識別替換功能詳解
OpenCV-Python是一個Python庫,旨在解決計算機視覺問題。本文將利用Python+OpenCV實現(xiàn)圖像識別替換功能,感興趣的小伙伴可以動手嘗試一下2022-07-07
Python 中數(shù)組和數(shù)字相乘時的注意事項說明
這篇文章主要介紹了Python 中數(shù)組和數(shù)字相乘時的注意事項說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Python3.6連接Oracle數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Python3.6連接Oracle數(shù)據(jù)庫的方法,較為詳細的分析了cx_Oracle模塊安裝及Python3.6使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫的具體操作步驟與相關注意事項,需要的朋友可以參考下2018-05-05
python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能示例
這篇文章主要介紹了python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能,結合實例形式分析了Python表單登錄相關的請求與響應操作實現(xiàn)技巧,需要的朋友可以參考下2019-09-09
Python Flask全棧項目實戰(zhàn)構建在線書店流程
這篇文章主要為大家介紹了Python Flask全流程全棧項目實戰(zhàn)之在線書店構建實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

