代碼+步驟GM(1,1)灰色預測模型-案例長江水質綜合評價賽題-級比檢測C的確定-matlab完整代碼附送

GM(1,1)灰色預測模型-案例長江水質綜合評價賽題第三題-matlab完整代碼附送

看到上一篇Blog在短短几天Pageviews就達到了1300多,看來大家還是比較中意建模上的筆記🤭,小白一個,也是是自己在學習上的經驗總結與教訓反思。
(說到小白,爲什麼我突然想到的是今年的全國卷II,公子小白,啊~這!)

(1)對長江近兩年多的水質情況做出定量的綜合評價,並分析各地區水質的污染狀況。
(2)研究、分析長江干流近一年多主要污染物高錳酸鹽指數和氨氮的污染源主要在哪些地區?
(3)假如不採取更有效的治理措施,依照過去10年的主要統計數據,對長江未來水質污染的發展趨勢做出預測分析,比如研究未來10年的情況
(4)根據你的預測分析,如果未來10年內每年都要求長江干流的Ⅳ類和Ⅴ類水的比例控制在20%以內,且沒有劣Ⅴ類水,那麼每年需要處理多少污水?
(5)你對解決長江水質污染問題有什麼切實可行的建議和意見。

預測模型的種類

定量預測方法:
灰色預測
迴歸分析法
時間序列分析(移動平均、指數平滑)
馬爾科夫(Markov)預測
差分方程模型
微分方程模型
神經網絡預測法

灰色系統理論

部分公式與理論參考:洛陽理工-常用的預測方法簡介ppt-數理部-任銘

爲什麼要學灰色預測

灰色預測在工業、農業、商業等經濟領域,以及環境、社會和軍事等領域中都有廣泛的應用. 特別是依據目前已有的數據對未來的發展趨勢做出預測分析,同時也可以對行爲特徵的異常情況發生的時刻進行估計計算等等.

灰色預測理論

灰色系統的基本概念
(1)如果一個系統中具有充足的信息量,其發展變化的規律明顯、定量描述方便、結構與參數具體,則稱此係統爲白色系統.
(2)如果一個系統的內部特性全部是未知的,則稱此係統爲黑色系統.
(3)介於白色系統和黑色系統之間的稱爲灰色系統,即系統內部信息和特性是部分已知的,另一部分是未知的,例如:社會系統、農業系
統、經濟系統、氣象系統、生物系統等.
區別白色系統與灰色系統的重要標誌:是系統內各因素之間是否具有確定的關係.
灰色系統理論是研究解決灰色系統分析、建模、預測、決策和控制的理論. 灰色系統模型在數據處理和預測中經常使用.
(1)灰色系統理論建模特點:原始數據必須等時間間距.
(2)灰色模型 (Grey Model) 處理思路:首先對原始數據進行累加,弱化原始時間序列數據的隨機因素,然後建立生成數的微分方程
(3)灰色預測是對灰色系統所做的預測. 目前常用的一些預測方法(如迴歸分析等),需要較大的樣本. 若樣本較小,常造成較大誤差,使預測目標失效. 灰色預測模型所需建模信息少,運算方便,建模精度高,在各種預測領域都有着廣泛的應用,是處理小樣本預測問題的有效工具.

灰色預測方法

灰色預測是指利用GM模型對系統行爲特徵的發展變化規律進行估計預測,同時也可以對行爲特徵的異常情況發生的時刻進行估計計算等等. 這些工作實質上是將“隨機過程”當作“灰色過程”,“隨機變量”當作“灰變量”,並主要以灰色系統理論中的GM(1,1)模型來進行處理.
GM(1,1)模型是灰色系統理論中的單序列一階灰色微分方程.

預測模型步驟:
設已知參考數據序列爲在這裏插入圖片描述
做1次累加AGO(Acumulated Generating Operation)生成新序列:
在這裏插入圖片描述
求生成均值(mean)序列**(1)**
在這裏插入圖片描述

於是建立灰微分方程爲(2)
在這裏插入圖片描述
相應的GM(1,1)白微分方程爲(3)
在這裏插入圖片描述
將方程(2)變形爲(4)
在這裏插入圖片描述
將方程組(4)採用矩陣形式表達爲:
在這裏插入圖片描述
解方程 (5)得到最小二乘解爲
在這裏插入圖片描述
解方程 (3)得到GM(1,1)離散解
在這裏插入圖片描述
還原爲原始數列,預測模型爲
在這裏插入圖片描述
將(7)式代入(8)式得
在這裏插入圖片描述
GM(1,1)模型與統計模型相比,具有兩個顯著優點:
(1)灰色模型即使在少量數據情況下建立的模型,精度也會很高.
(2)灰色模型從其機理上講,越靠近當前時間點精度會越高,因此灰色模型的預測功能優於統計模型.
灰色系統建模實際上是一種以數找數的方法,即從系統的一個或幾個離散數列中找出系統的變化關係,試圖建立系統的連續變化模型.

灰色預測步驟

數據的檢驗與處理

在這裏插入圖片描述
在這裏插入圖片描述

建立模型

在這裏插入圖片描述

檢驗預測值

在這裏插入圖片描述

預測預報

在這裏插入圖片描述
-------------------------------------分割線----------------------------------------
說完了灰色預測的具體步驟那麼對於長江水質的問題三就迎刃而解了,首先我要說的是,灰色預測數據的選取是否合理對預測結果準確性與否起到很大的影響!
相信大家都看過很多的論文,對於不同的數據選取方法一定有了自己的理解,不過我們可以重新看一下問題三:
(3)假如不採取更有效的治理措施,依照過去10年的主要統計數據,對長江未來水質污染的發展趨勢做出預測分析,比如研究未來10年的情況。

灰色預測注意事項

部分公式與理論參考:洛陽理工-長江水質講解-200619

  1. 水質污染髮展趨勢,水質污染髮展趨勢與許多因素有關,不同的時期(枯水期、豐水期、水文年)可能以後的發展趨勢也有所不同,如果全部統一處理,忽略三個時期的不同發展趨勢,最後得到的結果是否合理,是否符合現實,有待考證。
    所以,鄙人之見:
    不妨將所有時期所有河道(全流域、幹流、支流)未來十年全部預測-
    其實程序大同小異,只是處理的數據量多少而已,這裏數據量的導入是一個大問題,這個待會再說。🤭
    所有時期所有河道(全流域、幹流、支流)未來十年全部預測-後會得到6X90的矩陣。
    2.要注意的便是這個要點,其他的和灰色預測步驟相同,可以先選數據I類水-枯水期-全流域-10年的數據組成一個原始矩陣,進行求解。
    之後I類水-枯水期-幹流-10年………………以此類推。
    需要注意的是,因爲10年預測後十年,可想而知,誤差會有多大,所以爲了減小誤差,我們可以以前10年預測第11年,再以前11年預測第12年,以此類推。
    3.數據一定要提前進行級比檢測,不然預測出來的數據emmmmm,沒法看。
    沒有級比檢測的預測數據:
    在這裏插入圖片描述
    有級比檢測的預測數據:
    在這裏插入圖片描述
    級比檢測的C值也不太好找,網上也沒有什麼實質性的文章,詳細請參考我上一篇Blog
    https://blog.csdn.net/m0_46742690/article/details/107112396
    鏈接: https://blog.csdn.net/m0_46742690/article/details/107112396.
    這裏有具體代碼,此代碼也會在本章後出現,
    4.因爲灰色預測模型只是將原始數據序列的規律趨勢體現出來,但並沒有考慮六類水質的河長佔總河長的百分比爲1,且出現的數據既有負值也有正值,也有數據很大,基於此,我們要對數據根據百分比要求進行歸一化,即一個時期一個河道六類水百分比爲1.

具體實現程序matlab(以c/python的思想進行編譯-簡單易懂(主要是matlab學的太差-害))

需要注意的是,因爲10年預測後十年,可想而知,誤差會有多大,所以爲了減小誤差,我們可以以前10年預測第11年,再以前11年預測第12年,以此類推,此種方法的代碼如下:

%導入原始數據
fore_num = 1;
c = 0;
for y = 1 : 54
flag_1 = 1;
for h = 1:10
flag = 0;
if(flag == 0)
level = y ;
if( flag_1 == 1 )
x0 = xlsread('附件四原始數據_拆分' , level ,' A1  :  J1 ' );
end
if( flag_1 == 2 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A2  :  K2 ' );
end
if( flag_1 == 3 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A3  :  L3 ' );
end
if( flag_1 == 4 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A4  :  M4 ' );
end
if( flag_1 == 5 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A5  :  N5 ' );
end
if( flag_1 == 6 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A6  :  O6 ' );
end
if( flag_1 == 7 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A7  :  P7 ' );
end
if( flag_1 == 8 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A8  :  Q8 ' );
end
if( flag_1 == 9 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A9  :  R9 ' );
end
if( flag_1 == 10 )
x0 = xlsread('預測完成數據_級比_拆分' , level ,' A10  :  S10 ' );
end
%x0 = xlsread('預測完成數據_級比_拆分'  , level , 'A7  :  P7' );
b = x0(1,1);
length_x0 = length(x0);
%Ratio爲檢驗係數,即數列的級比
%x0 = x0 + 40;
Ratio = zeros(1 , length_x0 - 1);
for i = 1 : length_x0 - 1
    Ratio(i) = x0(i) / x0(i+1);
end
x1 = ones(1 , length_x0);
%對數據的級比做判斷
if ( exp(-2 / (length_x0+1)) < min(Ratio) && max(Ratio) < exp(2 / (length_x0+1)) )
%0.83381.1994    
%對x0數組進行維數累加求和,得到x1
x1 = cumsum(x0);
%生成均值序列  alpha自取
alpha = 0.5;%input('please enter alpha number:  ');
z1 = zeros(1 , length_x0 - 1);
for k = 2 : length_x0
    z1(k-1) = alpha * x1(k) + (1-alpha) * x1(k-1);
end
%解方程得到最小二乘法的解爲 a_b 
y0 = x0( 2 : 1 : length_x0 );%()中沒有,說明只有行沒有列
B = [-z1 ; ones( 1 , length_x0-1 )];
%gj爲a和b的數據
a_b = ( inv(B * B') ) * B * y0';

n = fore_num;%input('預測的數據個數爲:');
for k = 1 : length_x0 + n - 1
x1(k+1) = ( (x0(1) - (a_b(2) / a_b(1)) ) * ( exp(-k * a_b(1)) ) ) + a_b(2) / a_b(1);
end
x0(1) = x1(1);
for k = 2 : length_x0 + n
  x0(k) = x1(k) - x1(k-1);
end
else
    disp('數據不滿足檢驗,將對數據進行處理')
    while(1)
        x0 = x0 + 0.1;
        Ratio = zeros(1 , length_x0 - 1);
        for i = 1:length_x0 - 1
            Ratio(i) = x0(i) / x0(i+1);
        end
        if( exp(-2 / (length_x0+1)) < min(Ratio) && max(Ratio) < exp(2 / (length_x0+1)) )
            break;
        end
    end
    c = x0(1,1) - b;
    fprintf( '數據進行處理完成,c的值爲%d\n' , c ); 
    flag = 1;
end
end
if(flag == 1)
length_x0 = length(x0);
%Ratio爲檢驗係數,即數列的級比
%x0 = x0 + 40;
Ratio = zeros(1 , length_x0 - 1);
for i = 1:length_x0 - 1
    Ratio(i) = x0(i) / x0(i+1);
end
x1 = ones(1 , length_x0);
%對數據的級比做判斷
if ( exp(-2 / (length_x0+1)) < min(Ratio) && max(Ratio) < exp(2 / (length_x0+1)) )
%0.83381.1994    
%對x0數組進行維數累加求和,得到x1
x1 = cumsum(x0);
%生成均值序列  alpha自取
alpha = 0.5;%input('please enter alpha number:  ');
z1 = zeros(1 , length_x0 - 1);
for k = 2 : length_x0
    z1(k-1) = alpha * x1(k) + (1-alpha) * x1(k-1);
end
%解方程得到最小二乘法的解爲 a_b 
y0 = x0( 2 : 1 : length_x0 );%()中沒有,說明只有行沒有列
B = [-z1 ; ones( 1 , length_x0-1 )];
%gj爲a和b的數據
a_b = ( inv(B * B') ) * B * y0';

n = fore_num;%input('預測的數據個數爲:');
for k = 1 : length_x0 + n - 1
x1(k+1) = ( (x0(1) - (a_b(2) / a_b(1)) ) * ( exp(-k * a_b(1)) ) ) + a_b(2) / a_b(1);
end
x0(1) = x1(1);
for k = 2 : length_x0 + n
  x0(k) = x1(k) - x1(k-1);
end
end
end
x0 = x0 -c ;
%plot(x0,'*')
if( flag_1 == 1 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A2  :  K2  ' )
    flag_1 = 2 ;
elseif( flag_1 == 2 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A3  :  L3  ' )
    flag_1 = 3 ;
elseif( flag_1 == 3 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A4  :  M4  ' )
    flag_1 = 4 ;
elseif( flag_1 == 4 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A5  :  N5  ' )
    flag_1 = 5 ;
elseif( flag_1 == 5 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A6  :  O6  ' )
    flag_1 = 6 ;
elseif( flag_1 == 6 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A7  :  P7  ' )
    flag_1 = 7 ;
elseif( flag_1 == 7 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A8  :  Q8  ' )
    flag_1 = 8 ;
elseif( flag_1 == 8 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A9  :  R9  ' )
    flag_1 = 9 ;
elseif( flag_1 == 9 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A10  :  S10  ' )
    flag_1 = 10 ;
elseif( flag_1 == 10 )
    xlswrite( '預測完成數據_級比_拆分' , x0 , level , ' A11  :  T11  ' )
    flag_1 = 11 ;
end
end
end

~~主要是不想一個一個數據進行導入,一共6X9X10個單元意味着我要導入 (6X9X10 / 10)次,/(ㄒoㄒ)/,誰能受了-----
這就問題來了,matlab一定有相關函數可以快速實現分批導入,我不會 -_-.
不過數據確實蠻多的,我至少運行了2分多鐘,要知道我做單片機嵌入式千把行的代碼燒錄單片機也就10幾秒,難道不恐怖嗎???????
運行結果(部分):
在這裏插入圖片描述
在這裏插入圖片描述
emmmmmmmmmmmmmmmmmm
在這裏插入圖片描述

**羞答答的玫瑰靜悄悄地開**
**慢慢地綻放她留給我的情懷**
**春天的手呀翻閱她的等待**
**我在暗暗思量該不該將她輕輕地摘**
**羞答答的玫瑰靜悄悄地開**
**慢慢地燃燒她不承認的情懷**
**清風的手呀試探她的等待**
**我在暗暗猶豫該不該將她輕輕地摘**
**怎麼捨得如此接受你的愛**
**從來喜歡都會被愛成悲哀**
**怎麼捨得如此攬你入胸懷**
**當我越是深愛脾氣就會越壞**
**羞答答的玫瑰靜悄悄地開**
**慢慢地同時凋零同時盛開**
**愛情的手呀撫過她的等待**
**我在暗暗惆悵竟不曾將她輕輕地摘**

還是這種圖直觀一些。。。。。。。。。。。
能看完到最後????
你也太棒了吧!!!!!!!!!
We will part to see you again.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章