一文詳解Python灰色預(yù)測模型實(shí)現(xiàn)示例
前言
博主參與過大大小小十次數(shù)學(xué)建模比賽,也獲得了不少建模獎(jiǎng)項(xiàng)。對(duì)于一些小批量樣本數(shù)據(jù)去做預(yù)測或者是評(píng)估其規(guī)律性的話,比較適合的模型一般都是選擇灰色預(yù)測模型。該模型解釋性強(qiáng)而且易于理解,建模手段也比較簡單。在一些不確定是否存在相關(guān)標(biāo)量或者是存在位置特征的時(shí)候,用灰色預(yù)測模型尤為明顯,牽扯太多變量時(shí)候可以以量曾量減的方式顯現(xiàn)其變化規(guī)律,是建模比較好用的算法和思路。但是首先我們要明白該模型的使用場景以及優(yōu)缺點(diǎn)才能更好的解釋建模的效果。故為接下來的美賽,我將把一些常用建模的模型和代碼補(bǔ)上。
一、模型理論
灰色預(yù)測模型是通過少量的、不完全的信息,建立數(shù)學(xué)模型做出預(yù)測的一種預(yù)測方法。是基于客觀事物的過去和現(xiàn)在的發(fā)展規(guī)律,借助于科學(xué)的方法對(duì)未來的發(fā)展趨勢和狀況進(jìn)行描述和分析,并形成科學(xué)的假設(shè)和判斷。
我們稱信息完全未確定的系統(tǒng)為黑色系統(tǒng),稱信息完全確定的系統(tǒng)為白色系統(tǒng),灰色系統(tǒng)就是這介于這之間,一部分信息是已知的,另一部分信息是未知的,系統(tǒng)內(nèi)各因素間有不確定的關(guān)系。
不知道大家知不知道白盒測試和黑盒測試,我們可以這樣通俗的理解,黑色系統(tǒng)就好比一個(gè)黑色的盒子你看不到里面裝著幾個(gè)小球,從里面拿出幾個(gè)小球或者是章魚都是未知數(shù)。而白色系統(tǒng)就像是透明的盒子,你能很清楚的看到里面是什么你想要拿什么出來拿多少個(gè)。而這個(gè)灰色系統(tǒng)介于他們之間,盒子是灰色的,只能模糊的看到一些小球,看不到幾個(gè)或者是有除了小球以外的其他東西。
灰色預(yù)測通過鑒別系統(tǒng)因素之間發(fā)展趨勢的相異程度,即進(jìn)行關(guān)聯(lián)分析,并對(duì)原始數(shù)據(jù)進(jìn)行生成處理來尋找系統(tǒng)變動(dòng)的規(guī)律,生成有較強(qiáng)規(guī)律性的數(shù)據(jù)序列,然后建立相應(yīng)的微分方程模型,從而預(yù)測事物未來發(fā)展趨勢的狀況。其用等時(shí)距觀測到的反映預(yù)測對(duì)象特征的一系列數(shù)量值構(gòu)造灰色預(yù)測模型,預(yù)測未來某一時(shí)刻的特征量,或達(dá)到某一特征量的時(shí)間。
特點(diǎn)
- 用灰色數(shù)學(xué)處理不確定量,使之量化。
- 充分利用已知信息尋求系統(tǒng)的運(yùn)動(dòng)規(guī)律。
- 灰色系統(tǒng)理論能處理貧信息系統(tǒng)。
二、模型場景
1.預(yù)測種類
- 灰色時(shí)間序列預(yù)測;即用觀察到的反映預(yù)測對(duì)象特征的時(shí)間序列來構(gòu)造灰色預(yù)測模型,預(yù)測未來某一時(shí)刻的特征量,或達(dá)到某一特征量的時(shí)間。
- 畸變預(yù)測;即通過灰色模型預(yù)測異常值出現(xiàn)的時(shí)刻,預(yù)測異常值什么時(shí)候出現(xiàn)在特定時(shí)區(qū)內(nèi)。
- 系統(tǒng)預(yù)測;通過對(duì)系統(tǒng)行為特征指標(biāo)建立一組相互關(guān)聯(lián)的灰色預(yù)測模型,預(yù)測系統(tǒng)中眾多變量間的相互協(xié)調(diào)關(guān)系的變化。
- 拓?fù)漕A(yù)測;將原始數(shù)據(jù)作曲線,在曲線上按定值尋找該定值發(fā)生的所有時(shí)點(diǎn),并以該定值為框架構(gòu)成時(shí)點(diǎn)序列,然后建立模型預(yù)測該定值所發(fā)生的時(shí)點(diǎn)。
2.適用條件
灰色預(yù)測模型可針對(duì)數(shù)量非常少(比如僅4個(gè)),數(shù)據(jù)完整性和可靠性較低的數(shù)據(jù)序列進(jìn)行有效預(yù)測,其利用微分方程來充分挖掘數(shù)據(jù)的本質(zhì),建模所需信息少,精度較高,運(yùn)算簡便,易于檢驗(yàn),也不用考慮分布規(guī)律或變化趨勢等。但灰色預(yù)測模型一般只適用于短期預(yù)測,只適合指數(shù)增長的預(yù)測,比如人口數(shù)量,航班數(shù)量,用水量預(yù)測,工業(yè)產(chǎn)值預(yù)測等。
三、建模流程
總體建模流程可以參考:
1.級(jí)比校驗(yàn)
trong>數(shù)據(jù)累加和微分方程構(gòu)造
3.系數(shù)求解
數(shù)據(jù)向量Y:
4.殘差檢驗(yàn)與級(jí)比偏差檢驗(yàn)
四、Python實(shí)例實(shí)現(xiàn)
我們通過得到的周數(shù)擁堵車輛數(shù)據(jù)進(jìn)行測試:
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ù)未通過級(jí)比檢驗(yàn)') return False print('該數(shù)據(jù)通過級(jí)比檢驗(yàn)') 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ù)后驗(yàn)差比及小誤差概率判斷預(yù)測結(jié)果 :param X0_hat: 預(yù)測結(jié)果 :return: ''' def result_evaluate(X0_hat,X0): S1 = np.std(X0, ddof=1) # 原始數(shù)據(jù)樣本標(biāo)準(zhǔn)差 S2 = np.std(X0 - X0_hat, ddof=1) # 殘差數(shù)據(jù)樣本標(biāo)準(zhǔn)差 C = S2 / S1 # 后驗(yàn)差比 Pe = np.mean(X0 - X0_hat) temp = np.abs((X0 - X0_hat - Pe)) < 0.6745 * S1 p = np.count_nonzero(temp) / len(X0) # 計(jì)算小誤差概率 print("原數(shù)據(jù)樣本標(biāo)準(zhǔn)差:", S1) print("殘差樣本標(biāo)準(zhǔn)差:", S2) print("后驗(yàn)差比:", C) print("小誤差概率p:", p) if __name__ == '__main__': plt.rcParams['font.sans-serif'] = ['SimHei'] # 步驟一(替換sans-serif字體) plt.rcParams['axes.unicode_minus'] = False # 步驟二(解決坐標(biāo)軸負(fù)數(shù)的負(fù)號(hào)顯示問題) # 原始數(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ùn)練集 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) # 訓(xùn)練 Y_pred = model_predict(a,u,len(X),X) # 預(yù)測 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) # 評(píng)估 # 可視化 plt.grid() plt.plot(np.arange(len(X_train)), X_train, '->') plt.plot(np.arange(len(X_train)), Y_train_pred, '-o') plt.legend(['負(fù)荷實(shí)際值', '灰色預(yù)測模型預(yù)測值']) plt.title('訓(xùn)練集') 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(['負(fù)荷實(shí)際值', '灰色預(yù)測模型預(yù)測值']) plt.title('測試集') plt.show()
總結(jié)
模型優(yōu)點(diǎn):數(shù)據(jù)少且無明顯規(guī)律時(shí)可用,利用微分方程挖掘數(shù)據(jù)本質(zhì)規(guī)律。
模型缺點(diǎn):灰色預(yù)測只適合短期預(yù)測、指數(shù)增長的預(yù)測。
以上就是一文詳解Python灰色預(yù)測模型實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于Python灰色預(yù)測模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python與AI分析時(shí)間序列數(shù)據(jù)
- python編程開發(fā)時(shí)間序列calendar模塊示例詳解
- Python中LSTM回歸神經(jīng)網(wǎng)絡(luò)時(shí)間序列預(yù)測詳情
- 時(shí)間序列預(yù)測中的數(shù)據(jù)滑窗操作實(shí)例(python實(shí)現(xiàn))
- Python?sklearn預(yù)測評(píng)估指標(biāo)混淆矩陣計(jì)算示例詳解
- python合并RepeatMasker預(yù)測結(jié)果中染色體的overlap區(qū)域
- python目標(biāo)檢測yolo3詳解預(yù)測及代碼復(fù)現(xiàn)
- python?Prophet時(shí)間序列預(yù)測工具庫使用功能探索
相關(guān)文章
python圖像處理-利用一行代碼實(shí)現(xiàn)灰度圖摳圖
這篇文章主要介紹了python圖像處理-利用一行代碼實(shí)現(xiàn)灰度圖摳圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python版本坑:md5例子(python2與python3中md5區(qū)別)
這篇文章主要介紹了python版本坑:md5例子(python2與python3中md5區(qū)別),需要的朋友可以參考下2017-06-06Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解
這篇文章主要介紹了Python多線程Threading、子線程與守護(hù)線程,結(jié)合實(shí)例形式詳細(xì)分析了Python多線程Threading、子線程與守護(hù)線程相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03python使用dlib進(jìn)行人臉檢測和關(guān)鍵點(diǎn)的示例
這篇文章主要介紹了python使用dlib進(jìn)行人臉檢測和關(guān)鍵點(diǎn)的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12淺談對(duì)python中if、elif、else的誤解
這篇文章主要介紹了淺談對(duì)python中if、elif、else的誤解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08pytorch?rpc實(shí)現(xiàn)分物理機(jī)器實(shí)現(xiàn)model?parallel的過程詳解
這篇文章主要介紹了pytorch?rpc實(shí)現(xiàn)分物理機(jī)器實(shí)現(xiàn)model?parallel的過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Python中初始化一個(gè)二維數(shù)組及注意事項(xiàng)說明
這篇文章主要介紹了Python中初始化一個(gè)二維數(shù)組及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08