Matlab實現GM(1,1)模型(源代碼)


關於這個模型的介紹不想多說了,只是一個娛樂而已。下面是所有的代碼,直接粘到你的M文件里面,然后跑就是了。 一分錢不收。

 

function [ simulation,params] = GM( org )
n=length(org);
%一次累加
for i=1:n
    acc(i)=sum(org(1:i));
end
%計算背景值
for i=1:(n-1)
    zk(i)=0.5*(acc(i)+acc(i+1));
end
%求解參數
 params=polyfit(zk,org(2:end),1); 
 %計算模擬值
 for i=1:n
     if i==1
     simulation(i)=org(1);
     else 
     simulation(i)=(org(1)+params(2)/params(1))*(1-exp(-params(1)))*exp(params(1)*(i-1));
     end
 end
 plot(1:n,org,'-o',1:n,simulation,'-*');
 legend('原始序列','擬合序列');

 

 

細心的朋友應該會注意到一件事情:灰色預測模型里面不是有那么多矩陣運算嗎,在這里怎么沒有? 如果你跑了程序又會發現,這個程序計算出來的結果,跟任何一本書上寫的結果完全一樣。這是為啥嘞?

 

如果再細心點,會看到我這里獲取參數的代碼 :  params=polyfit(zk,org(2:end),1);。  沒錯, 就是線性擬合。

任何一本講灰色理論的書上都會告訴你,參數估計是由這個式子加上最小二乘法得到的。

 

這事情的確沒有錯,但如果你仔細點,把移到等式的右邊去,你發現了什么。 沒錯,這TM不就是一個離散直線方程么。

 

那么這里只需要把看成是直線方程里的y,而把看成是x。 那這個參數估計,就只是個簡單的線性回歸而已。

 

這樣一來,只要是能實現線性回歸的函數,完全都可以實現它所謂的參數估計。它那些大片大片的矩陣計算,完全只是為了忽悠你們而已,呵呵呵呵呵呵呵呵。

 

我大概數了一下,去掉我那些注釋和畫圖,寫一個GM(1,1)模型只需要10幾行代碼。如果你想偷懶,讓它更簡省,其實還可以更少。 比如累加的時候直接就把背景值算了,少一次循環。當然這種事情其實也沒必要做。

 

至於學術圈里,各種各樣的改進模型,尤其背景值改進模型。 你只需要把這段代碼里面的計算公式換成那些看起來很牛B的文獻里的公式就可以了。 這是高中生都應該辦得到的事情。

 

好了,這個文章好像也沒有什么主題,其實就是想讓大家了解一下,所謂的牛B的灰色理論到底是個什么玩意。  (一個直線擬合就拿來吹出那么多東西,也真心佩服!)

希望大家不要被學術圈的忽悠們給忽悠了,不要在沒必要的地方浪費太多時間。   

 

 

番外篇:

 

有了上述的思路,相信你們應該能想得到其它的模型該如何實現了。  可以這樣講,在灰色理論中提到的最小二估計,實質上都只是將LS的線性回歸中的功能用起來了,所以其它的各種各樣的模型都可以用這段代碼的思路來實現。 

 

我上面也說過了,只要是能實現線性擬合的工具,都可以實現它了吧。那么你還能想到什么嘞?

 

1、SPSS,當然這個多此一舉了;

2、EXCEL, 對,就是微軟的那個OFFICE里面的EXCEL。 你甚至都用不着去用它的數據分析工具,只需要用slope和intercept兩個函數就夠了。

3、各種版本的統計學工具,開源工具,這里就不一一列舉了。你去GOOGLE上 搜一下  "statistical " +[任意一種程序語言],你會找到無數個這種東西。

 

那么綜上所述,可以看出幾件事:

1、這玩意沒啥神秘的;

2、這玩意是騙人的;

3、如果你還在寫矩陣,呵呵呵,你還是回北大青鳥吧。(哈哈,開個玩笑)

 

其實我真正想說的是,不管是做學術還是玩技術,最重要的不外乎兩點:1.認識問題的實質;2.不要裝B,用最簡單的方法去實現。

 

如果做到了以上兩點,那么無論是在哪都能混得走。  如果只是用這個語言寫過點什么,那個語言寫過點什么,那么,你真的該去北大青鳥了。 這次不開玩笑!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM