我愈來愈不喜歡matlab,由於它讓咱們只須要使用它的工具箱;我愈來愈喜歡matlab,由於在它的工具箱裏隱藏着無數優秀甚至卓越的算法。算法
晚上閒的沒事,突發奇想預測一下中國表明團在2012年倫敦運動會上得到金牌和獎牌的狀況,使用matlab神經網絡工具箱BP網絡設計與分析函數進行預測,程序根據《matlab在數學建模中的應用》一書中神經網絡一章中的程序改編而成。shell
clc %原始數據 %參賽人數 sqrs=[225 301 251 309 311 411 639 ]; %金牌數 sqjdcs=[15 5 16 16 28 32 51]; %獎牌數 sqglmj=[32 28 54 50 59 63 100 ]; p=[sqrs] %輸入數據矩陣 t=[sqjdcs;sqglmj] %目標數據矩陣 %利用premnmx函數對數據進行歸一化 [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); % 對於輸入矩陣p和輸出矩陣t進行歸一化處理 dx=[-1,1]; %歸一化處理後最小值爲-1,最大值爲1 %BP網絡訓練 net=newff(dx,[1,2],{'tansig','purelin'},'traingdx'); %創建模型,並用梯度降低法訓練. net,trainParam.Lr=1; %學習速率爲1 net.trainParam.epochs=50000; %最大訓練輪迴爲50000次 net.trainParam.goal=3; %均方偏差 net=train(net,pn,tn); %開始訓練,其中pn,tn分別爲輸入輸出樣本 %利用原始數據對BP網絡仿真 an=sim(net,pn); %用訓練好的模型進行仿真 a=postmnmx(an,mint,maxt); % 把仿真獲得的數據還原爲原始的數量級; %本例因樣本容量有限使用訓練數據進行測試,一般必須用新鮮數據進行測試 x=1984:4:2008; newk=a(1,:); newh=a(2,:); figure (2); subplot(2,1,1);plot(x,newk,'r-o',x,sqjdcs,'b--+') %繪值金牌數對比圖; legend('網絡輸出金牌數','實際金牌數'); xlabel('年份');ylabel('金牌數/枚'); subplot(2,1,2);plot(x,newh,'r-o',x,sqglmj,'b--+') %繪製獎牌數對比圖; legend('網絡輸出獎牌數','實際獎牌數'); xlabel('年份');ylabel('獎牌數/枚'); %利用訓練好的網絡進行預測 % 當用訓練好的網絡對新數據pnew進行預測時,也應做相應的處理: pnew=[621]; %2012年的相關數據; pnewn=tramnmx(pnew,minp,maxp); %利用原始輸入數據的歸一化參數對新數據進行歸一化; anewn=sim(net,pnewn); %利用歸一化後的數據進行仿真; anew=postmnmx(anewn,mint,maxt) %把仿真獲得的數據還原爲原始的數量級;
缺點與不足:(1)對神經網絡的使用經驗不是很足,每次運行程序結果都會發生較大變化,須要憑藉觀察取得較好的預測值;(2)金牌與獎牌數量只與表明團成員人數相關顯然不合理;(3)單獨對金牌數或獎牌數進行預測更容易使網絡輸出值與實際值之間偏差較小,可見根據單一因素預測不許。網絡
結果:屢次運行程序,選取偏差較小的預測狀況,最終接受的預測值爲金牌36枚,獎牌總數91枚。函數
最後,本預測純屬娛樂,若有雷同,不勝榮幸。工具