關於這個模型的介紹不想多說了,只是一個娛樂而已。下面是所有的代碼,直接粘到你的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,用最簡單的方法去實現。
如果做到了以上兩點,那么無論是在哪都能混得走。 如果只是用這個語言寫過點什么,那個語言寫過點什么,那么,你真的該去北大青鳥了。 這次不開玩笑!