BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程.doc_第1頁
BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程.doc_第2頁
BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程.doc_第3頁
BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程.doc_第4頁
BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程.doc_第5頁
免費預覽已結束,剩余16頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程(一) 考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程(一)本文考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程系列由論壇超級版主akjuan整理和原創(chuàng),我們在此表示特別感謝這兩天在學習bp,總結和匯報一下,和大家一起學習。希望初入神經(jīng)網(wǎng)絡能有所收獲,給新手一些幫組和啟發(fā)。也希望熟悉bp的高手,多提寶貴意見和建議。 學習內(nèi)容總結成五個小節(jié),具體內(nèi)容如下:第一節(jié)內(nèi)容:包括神經(jīng)網(wǎng)絡的基礎知識,BP網(wǎng)絡的特點,bp主要應用的場合,使用時應注意的問題。第二節(jié)內(nèi)容:主要是闡述BP中幾個容易混繞的概念和問題,包括什么是網(wǎng)絡的泛化能力?過擬合是什么,怎么處理?學習速率有什么作用?神經(jīng)網(wǎng)絡的權值和閾值分別是個什么概念?用BP逼近非線性函數(shù),如何提高訓練精度?第三節(jié)內(nèi)容:主要闡述使用matlab實現(xiàn),為了充分利用數(shù)據(jù),得到最優(yōu)的網(wǎng)絡訓練結果,在網(wǎng)絡建立前,應該進行的基本數(shù)據(jù)處理問題,包括:BP神經(jīng)網(wǎng)絡matlab實現(xiàn)的基本步驟,數(shù)據(jù)歸一化問題和方法,輸入訓練數(shù)據(jù)的亂序排法,以及分類方法,如何查看和保存訓練的結果,每次結果不一樣問題。第四節(jié)內(nèi)容:bp神經(jīng)網(wǎng)絡進行交通預測的Matlab例子及源代碼,bp神經(jīng)網(wǎng)絡進行交通預測的Matlab程序的優(yōu)化(主要是按設置誤差要求,尋找最優(yōu)網(wǎng)絡過程)第五節(jié)內(nèi)容:bp神經(jīng)網(wǎng)絡處理蠓蟲分類問題的matlab例子及源代碼。不多說,先如主題,第一節(jié),很基礎,高手見諒。什么是神經(jīng)網(wǎng)絡?神經(jīng)網(wǎng)絡是由很多神經(jīng)元組成的,首先我們看一下,什么是神經(jīng)元上面這個圖表示的就是一個神經(jīng)元,我們不管其它書上說的那些什么樹突,軸突的。我用個比較粗淺的解釋,可能不太全面科學,但對初學者很容易理解:1、我們把輸入信號看成你在matlab中需要輸入的數(shù)據(jù),輸進去神經(jīng)網(wǎng)絡后2、這些數(shù)據(jù)的每一個都會被乘個數(shù),即權值w,然后這些東東與閥值b相加后求和得到u,3、上面只是線性變化,為了達到能處理非線性的目的,u做了個變換,變換的規(guī)則和傳輸函數(shù)有關可能還有人問,那么那個閥值是什么呢?簡單理解就是讓這些數(shù)據(jù)做了個平移,這就是神經(jīng)元工作的過程。處理后的結果又作為輸入,可輸給別的神經(jīng)元,很多這樣的神經(jīng)元,就組成了網(wǎng)絡。在matlab中具體用什么算法實現(xiàn)這些,我們先不管,我們需要注意的是怎么使用。比如使用BP的神經(jīng)網(wǎng)絡newff()構建一個網(wǎng)絡,這些在后面的學習將提到。BP網(wǎng)絡的特點網(wǎng)絡實質(zhì)上實現(xiàn)了一個從輸入到輸出的映射功能,而數(shù)學理論已證明它具有實現(xiàn)任何復雜非線性映射的功能。這使得它特別適合于求解內(nèi)部機制復雜的問題。我們無需建立模型,或了解其內(nèi)部過程,只需輸入,獲得輸出。只要BPNN結構優(yōu)秀,一般20個輸入函數(shù)以下的問題都能在50000次的學習以內(nèi)收斂到最低誤差附近。而且理論上,一個三層的神經(jīng)網(wǎng)絡,能夠以任意精度逼近給定的函數(shù),這是非常誘人的期望;網(wǎng)絡能通過學習帶正確答案的實例集自動提取“合理的”求解規(guī)則,即具有自學習能力;網(wǎng)絡具有一定的推廣、概括能力。bp主要應用回歸預測(可以進行擬合,數(shù)據(jù)處理分析,事物預測,控制等)、 分類識別(進行類型劃分,模式識別等),在后面的學習中,我都將給出實例程序。但無論那種網(wǎng)絡,什么方法,解決問題的精確度都無法打到100%的,但并不影響其使用,因為現(xiàn)實中很多復雜的問題,精確的解釋是毫無意義的,有意義的解析必定會損失精度。BP注意問題1、BP算法的學習速度很慢,其原因主要有:a 由于BP算法本質(zhì)上為梯度下降法,而它所要優(yōu)化的目標函數(shù)又非常復雜,因此,必然會出現(xiàn)“鋸齒形現(xiàn)象”,這使得BP算法低效;b 存在麻痹現(xiàn)象,由于優(yōu)化的目標函數(shù)很復雜,它必然會在神經(jīng)元輸出接近0或1的情況下,出現(xiàn)一些平坦區(qū),在這些區(qū)域內(nèi),權值誤差改變很小,使訓練過程幾乎停頓;c 為了使網(wǎng)絡執(zhí)行BP算法,不能用傳統(tǒng)的一維搜索法求每次迭代的步長,而必須把步長的更新規(guī)則預先賦予網(wǎng)絡,這種方法將引起算法低效。2、網(wǎng)絡訓練失敗的可能性較大,其原因有:a 從數(shù)學角度看,BP算法為一種局部搜索的優(yōu)化方法,但它要解決的問題為求解復雜非線性函數(shù)的全局極值,因此,算法很有可能陷入局部極值,使訓練失敗;b 網(wǎng)絡的逼近、推廣能力同學習樣本的典型性密切相關,而從問題中選取典型樣本實例組成訓練集是一個很困難的問題。3、網(wǎng)絡結構的選擇:尚無一種統(tǒng)一而完整的理論指導,一般只能由經(jīng)驗選定。為此,有人稱神經(jīng)網(wǎng)絡的結構選擇為一種藝術。而網(wǎng)絡的結構直接影響網(wǎng)絡的逼近能力及推廣性質(zhì)。因此,應用中如何選擇合適的網(wǎng)絡結構是一個重要的問題。4、新加入的樣本要影響已學習成功的網(wǎng)絡,而且刻畫每個輸入樣本的特征的數(shù)目也必須相同。5、采用s型激活函數(shù),由于輸出層各神經(jīng)元的理想輸出值只能接近于1或0,而不能打到1或0,因此設置各訓練樣本的期望輸出分量Tkp時,不能設置為1或0,設置0.9或0.1較為適宜??祭瑽P神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程(二)本文考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程系列由論壇超級版主akjuan整理和原創(chuàng),我們在此表示特別感謝本節(jié)主要學習BP中幾個容易混繞的概念和問題:什么是網(wǎng)絡的泛化能力?過擬合是什么,怎么處理?學習速率有什么作用?神經(jīng)網(wǎng)絡的權值和閾值分別是個什么概念?用BP逼近非線性函數(shù),如何提高訓練精度?什么是網(wǎng)絡的泛化能力?一個神經(jīng)網(wǎng)路是否優(yōu)良,與傳統(tǒng)最小二乘之類的擬合評價不同(主要依據(jù)殘差,擬合優(yōu)度等),不是體現(xiàn)在其對已有的數(shù)據(jù)擬合能力上,而是對后來的預測能力,既泛化能力。網(wǎng)絡的預測能力(也稱泛化能力、推廣能力)與訓練能力(也稱逼近能力、學習能力)的矛盾。一般情況下,訓練能力差時,預測能力也差,并且一定程度上,隨訓練能力地提高,預測能力也提高。但這種趨勢有一個極限,當達到此極限時,隨訓練能力的提高,預測能力反而下降,即出現(xiàn)所謂“過擬合”現(xiàn)象。此時,網(wǎng)絡學習了過多的樣本細節(jié),而不能反映樣本內(nèi)含的規(guī)律。過擬合是什么,怎么處理?神經(jīng)網(wǎng)絡計算不能一味地追求訓練誤差最小,這樣很容易出現(xiàn)“過擬合”現(xiàn)象,只要能夠?qū)崟r檢測誤差率的變化就可以確定最佳的訓練次數(shù),比如15000次左右的學習次數(shù),如果你不觀察,設成500000次學習,不僅需要很長時間來跑,而且最后結果肯定令人大失所望。避免過擬合的一種方法是:在數(shù)據(jù)輸入中,給訓練的數(shù)據(jù)分類,分為正常訓練用、變量數(shù)據(jù)、測試數(shù)據(jù),在后面節(jié)將講到如何進行這種分類。其中變量數(shù)據(jù),在網(wǎng)絡訓練中,起到的作用就是防止過擬合狀態(tài)。學習速率有什么作用?學習速率這個參數(shù)可以控制能量函數(shù)的步幅,并且如果設為自動調(diào)整的話,可以在誤差率經(jīng)過快速下降后,將學習速率變慢,從而增加BPNN的穩(wěn)定性。此時訓練方法采用復制內(nèi)容到剪貼板 代碼:DEnet.trainFcn = traingda; % 變學習率梯度下降算法net.trainFcn = traingdx; % 變學習率動量梯度下降算法DE可以定義一個變動的學習速率,如復制內(nèi)容到剪貼板 代碼:DEp = -1 -1 2 2; 0 5 0 5;t = -1 -1 1 1;net = newff(p,t,3,traingda);net.trainParam.lr = 0.05;net.trainParam.lr_inc = 1.05;net = train(net,p,t);y = sim(net,p)DE在后面的擬合例題中,我們也將用到學習速率這個參數(shù)。神經(jīng)網(wǎng)絡的權值和閾值分別是個什么概念?第一節(jié)中,我們已經(jīng)談到了權值和閥值的概念。這里我們更深入的說明一下,因為他們很重要,關系到網(wǎng)絡最后的結果。權值和閾值是神經(jīng)元之間的連接,將數(shù)據(jù)輸入計算出一個輸出,然后與實際輸出比較,誤差反傳,不斷調(diào)整權值和閾值。假如下面兩個點屬于不同的類,須設計分類器將他們分開引用:p1=1 1 -1;p2=1 -1 -1;這里用單層神經(jīng)元感知器,假設初始權值復制內(nèi)容到剪貼板 代碼:DEw=0.2 0.2 0.3DE同時假設初始閥值復制內(nèi)容到剪貼板 代碼:DEb=-0.3DE輸出 a1 a2復制內(nèi)容到剪貼板 代碼:DEa1=hardlims(w*p1+b)a2=hardlims(w*p2+b)DE如果不能分開,還須不斷調(diào)整w,b用BP逼近非線性函數(shù),如何提高訓練精度(1)調(diào)整網(wǎng)絡結構增加網(wǎng)絡的層數(shù)可以進一步降低誤差,提高精度但會使網(wǎng)絡復雜化,從而增加網(wǎng)絡的訓練時間。精度的提高實際上也可以通過增加隱層神經(jīng)元的數(shù)目來獲得,其效果更容易觀察和掌握,所以應優(yōu)先考慮。(2)初始值選取為了使誤差盡可能小 ,需要合理選擇初始權重和偏置,如果太大就容易陷入飽和區(qū),導致停頓 。一般應選為均勻分布的小數(shù),介于 (-1,1) 。(3)學習速率調(diào)整學習速率的選取很重要 ,大了可能導致系統(tǒng)不穩(wěn)定,小了會導致訓練周期過長、收斂慢,達不到要求的誤差。一般傾向于選取較小的學習速率以保持系統(tǒng)穩(wěn)定,通過觀察誤差下降曲線來判斷。下降較快說明學習率比較合適,若有較大振蕩則說明學習率偏大。同時,由于網(wǎng)絡規(guī)模大小的不同,學習率選擇應當針對其進行調(diào)整。采用變學習速率的方案,令學習速率隨學習進展而逐步減少,可收到良好的效果。(4)期望誤差期望誤差當然希望越小越好,但是也要有合適值??祭瑽P神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程(三)本文考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程系列由論壇超級版主akjuan整理和原創(chuàng),我們在此表示特別感謝本節(jié)主要學習使用matlab實現(xiàn)bp算法的一般步驟和過程。為了充分利用數(shù)據(jù),得到最優(yōu)的網(wǎng)絡訓練結果,在網(wǎng)絡建立前應該進行的基本數(shù)據(jù)處理問題,包括:(1)BP神經(jīng)網(wǎng)絡matlab實現(xiàn)的基本步驟(2)數(shù)據(jù)歸一化問題和方法(3)輸入訓練數(shù)據(jù)的亂序排法,以及分類方法(4)如何查看和保存訓練的結果(5)每次結果不一樣問題。用matlab實現(xiàn)bp,其實很簡單,按下面步驟基本可以了BP神經(jīng)網(wǎng)絡matlab實現(xiàn)的基本步驟1、數(shù)據(jù)歸一化2、數(shù)據(jù)分類,主要包括打亂數(shù)據(jù)順序,抽取正常訓練用數(shù)據(jù)、變量數(shù)據(jù)、測試數(shù)據(jù)3、建立神經(jīng)網(wǎng)絡,包括設置多少層網(wǎng)絡(一般3層以內(nèi)既可以,每層的節(jié)點數(shù)(具體節(jié)點數(shù),尚無科學的模型和公式方法確定,可采用試湊法,但輸出層的節(jié)點數(shù)應和需要輸出的量個數(shù)相等),設置隱含層的傳輸函數(shù)等。關于網(wǎng)絡具體建立使用方法,在后幾節(jié)的例子中將會說到。4、指定訓練參數(shù)進行訓練,這步非常重要,在例子中,將詳細進行說明5、完成訓練后,就可以調(diào)用訓練結果,輸入測試數(shù)據(jù),進行測試6、數(shù)據(jù)進行反歸一化7、誤差分析、結果預測或分類,作圖等數(shù)據(jù)歸一化問題歸一化的意義:首先說一下,在工程應用領域中,應用BP網(wǎng)絡的好壞最關鍵的仍然是輸入特征選擇和訓練樣本集的準備,若樣本集代表性差、矛盾樣本多、數(shù)據(jù)歸一化存在問題,那么,使用多復雜的綜合算法、多精致的網(wǎng)絡結構,建立起來的模型預測效果不會多好。若想取得實際有價值的應用效果,從最基礎的數(shù)據(jù)整理工作做起吧,會少走彎路的。歸一化是為了加快訓練網(wǎng)絡的收斂性,具體做法是:1 把數(shù)變?yōu)椋?,1)之間的小數(shù)主要是為了數(shù)據(jù)處理方便提出來的,把數(shù)據(jù)映射到01范圍之內(nèi)處理,更加便捷快速,應該歸到數(shù)字信號處理范疇之內(nèi)。2 把有量綱表達式變?yōu)闊o量綱表達式歸一化是一種簡化計算的方式,即將有量綱的表達式,經(jīng)過變換,化為無量綱的表達式,成為純量比如,復數(shù)阻抗可以歸一化書寫:Z = R + jL = R(1 + jL/R) ,復數(shù)部分變成了純數(shù)量了,沒有量綱。另外,微波之中也就是電路分析、信號系統(tǒng)、電磁波傳輸?shù)?,有很多運算都可以如此處理,既保證了運算的便捷,又能凸現(xiàn)出物理量的本質(zhì)含義。神經(jīng)網(wǎng)絡歸一化方法:由于采集的各數(shù)據(jù)單位不一致,因而須對數(shù)據(jù)進行-1,1歸一化處理,歸一化方法主要有如下幾種,供大家參考:1、線性函數(shù)轉(zhuǎn)換,表達式如下:復制內(nèi)容到剪貼板 代碼:DEy=(x-MinValue)/(MaxValue-MinValue)DE說明:x、y分別為轉(zhuǎn)換前、后的值,MaxValue、MinValue分別為樣本的最大值和最小值。2、對數(shù)函數(shù)轉(zhuǎn)換,表達式如下:復制內(nèi)容到剪貼板 代碼:DEy=log10(x)DE說明:以10為底的對數(shù)函數(shù)轉(zhuǎn)換。3、反余切函數(shù)轉(zhuǎn)換,表達式如下:復制內(nèi)容到剪貼板 代碼:DEy=atan(x)*2/PIDEmatlab中歸一化的實現(xiàn):matlab中的歸一化處理有五種方法,只會其中一種就可以了,我喜歡用第4種,因為習慣和方便注意:第一組和第二組歸一化函數(shù)在Matlab7.0以上已遺棄,他們的用法相似,pre*是歸一化,post*是反歸一化,tram*是使用同樣的設置歸一化另外一組數(shù)據(jù)1. 內(nèi)部函數(shù)premnmx、postmnmx、tramnmx,將數(shù)據(jù)歸一化到(-1,1)premnmx的語法格式是復制內(nèi)容到剪貼板 代碼:DE:Pn,minp,maxp,Tn,mint,maxt=premnmx(P,T)DE其中P,T分別為原始輸入和輸出數(shù)據(jù),minp和maxp分別為P中的最小值和最大值。mint和maxt分別為T的最小值和最大值。我們在訓練網(wǎng)絡時,如果所用的是經(jīng)過歸一化的樣本數(shù)據(jù),那么以后使用網(wǎng)絡時所用的新數(shù)據(jù)也應該和樣本數(shù)據(jù)接受相同的預處理,這就要用到tramnmx,換句話說使用同一個歸一化設置(setting)歸一化另外一組數(shù)據(jù)。如下所示:復制內(nèi)容到剪貼板 代碼:DEPn=tramnmx(P,minp,maxp)DE其中P和Pn分別為變換前、后的輸入數(shù)據(jù),maxp和minp分別為premnmx函返回的最大值maxp和最小值minp。2、prestd、poststd、trastd歸化數(shù)據(jù)到(0,1)用法與1差不多。詳細可以help prestd。上述兩種方法是可以相互轉(zhuǎn)化的,比如,第一種歸化后的數(shù)據(jù)為p,則(1+p)./2的結果就是第二種了3、mapminmax()將數(shù)據(jù)歸一化到(-1,1),是6.5中*mnmx系列的替換函數(shù)該函數(shù)同時可以執(zhí)行歸一化、反歸一化和歸一化其他數(shù)據(jù)的功能,具體看幫助和后面的實例復制內(nèi)容到剪貼板 代碼:DE% 歸一化數(shù)據(jù)輸入為p,輸出為tnormInput,ps = mapminmax(p);normTarget,ts = mapminmax(t);% 反歸一化trainOutput = mapminmax(reverse,normTrainOutput,ts);trainInsect = mapminmax(reverse,trainSamples.T,ts);validateOutput = mapminmax(reverse,normValidateOutput,ts);validateInsect = mapminmax(reverse,validateSamples.T,ts);testOutput = mapminmax(reverse,normTestOutput,ts);testInsect = mapminmax(reverse,testSamples.T,ts);%例子:x1 = 1 2 4; 1 1 1; 3 2 2; 0 0 0y1,PS = mapminmax(x1,0,1)% 歸化到 0,1,若不填,則默認為-1,1%還原:x1_again = mapminmax(reverse,y1,PS)DE4、mapstd()將數(shù)據(jù)歸一化到(0,1),是6.5中*std系列的替代函數(shù)同理,3和4兩種方法是可以相互轉(zhuǎn)化的,比如,第一種歸化后的數(shù)據(jù)為p,則(1+p)./2的結果就是第二種了。5、自己寫歸一化函數(shù),這個網(wǎng)上很多,大家可以百度下輸入訓練數(shù)據(jù)的亂序排法,以及分類注意:dividevec()函數(shù)在7.6版本還可以使用把數(shù)據(jù)重新打亂順序,進行輸入,可以讓數(shù)據(jù)更加具備典型性和更優(yōu)良的泛化能力!把數(shù)據(jù)進行打亂,并分類為:訓練輸入數(shù)據(jù)、變量數(shù)據(jù)、測試數(shù)據(jù)的方法我用百度搜了一下,發(fā)現(xiàn)有些方法,但居然很少看到使用matlab內(nèi)部函數(shù)直接進行的,其實matlab自帶的內(nèi)部函數(shù)dividevec,完全能勝任上述工作,推薦!但這個存在一個問題是,因為打亂了,最后分析結果的時候,數(shù)據(jù)重新排列困難,因為丟失了數(shù)據(jù)在數(shù)組中的位置參數(shù)。具體用法可以參見下面我的bp交通預測的例子。因為我用的7.0版本,Neural Network Toolbox Version 5.0.2 (R2007a)昨天,我去mathworks公司查看了一下nnet的新手冊,上述問題得到了解決,里面視乎沒有介紹dividverc這個函數(shù)了,但增加了新的函數(shù)來完成上述功能,并返回標號(手頭沒裝新版本Neural Network Toolbox Version 6.0 (R2008a)),看guide大概是這個意思(有新版本的,可以試一下,這個函數(shù)是不是這個意思):divideblock,divideind,divideint和dividerand上述函數(shù),用法和功能基本相同,只是打亂的方法不一樣,分別是block方法抽取、按數(shù)組標號自定義抽取、交錯索引抽取和隨機抽。下面以divideblock為例,講解其基本用法:復制內(nèi)容到剪貼板 代碼:DEtrainV,valV,testV,trainInd,valInd,testInd =divideblock(allV,trainRatio,valRatio,testRatio)訓練數(shù)據(jù),變量數(shù)據(jù),測試數(shù)據(jù),訓練數(shù)據(jù)矩陣的標號,變量數(shù)據(jù)標號,測試數(shù)據(jù)標號 =divideblock(所有數(shù)據(jù),訓練數(shù)據(jù)百分比,變量數(shù)據(jù)百分比,測試數(shù)據(jù)百分比)DE其實dividevec和后面四個分類函數(shù)的區(qū)別在于,dividevec一般直接在Matlab代碼中調(diào)用。而后面四個函數(shù)是通過設置網(wǎng)絡的divideFcn函數(shù)來實現(xiàn),比如,net.divideFcn=divideblock,但不是說不可以在代碼中像dividevec直接調(diào)用如何查看和保存結果訓練好的權值、閾值的輸出方法是:輸入到隱層權值:復制內(nèi)容到剪貼板 代碼:DEw1=net.iw1,1DE隱層閾值:復制內(nèi)容到剪貼板 代碼:DEtheta1=net.b1DE隱層到輸出層權值:復制內(nèi)容到剪貼板 代碼:DEw2=net.lw2,1;DE輸出層閾值:復制內(nèi)容到剪貼板 代碼:DEtheta2=net.b2DE訓練好的BP神經(jīng)網(wǎng)絡保存:復制內(nèi)容到剪貼板 代碼:DE%保存save file_name net_name%Matlab自動將網(wǎng)絡保存為mat數(shù)據(jù)文件,下次使用時可以直接載入%載入load file_nameDE每次結果不一樣問題因為每次初始化網(wǎng)絡時都是隨機的,而且訓練終止時的誤差也不完全相同,結果訓練后的權植和閥也不完全相同(大致是一樣的),所以每次訓練后的結果也略有不同。找到比較好的結果后,用命令save filen_ame net_name保存網(wǎng)絡,可使預測的結果不會變化,在需要的調(diào)用時用命令load filename載入。關于如何找到比較好的結果,進行保存,可以設置誤差,在循環(huán)中保存,具體使用可以參看bp交通預測優(yōu)化后的例子考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程(四)bp神經(jīng)網(wǎng)絡進行交通預測的Matlab源代碼本文考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程系列由論壇超級版主akjuan整理和原創(chuàng),我們在此表示特別感謝根據(jù)前面三節(jié)的學習內(nèi)容,可以基本編寫一個BP神經(jīng)網(wǎng)絡,來處理一些問題了。下面我給出一個bp神經(jīng)網(wǎng)絡進行交通預測的Matlab源代碼,里面?zhèn)溆休^為詳細的注釋,供給初學者! 復制內(nèi)容到剪貼板 代碼:DE%bp神經(jīng)網(wǎng)絡進行交通預測的Matlab源代碼% BP 神經(jīng)網(wǎng)絡用于預測% 使用平臺 - Matlab7.0% 數(shù)據(jù)為1986年到2000年的交通量 ,網(wǎng)絡為3輸入,1輸出% 15組數(shù)據(jù),其中9組為正常訓練數(shù)據(jù),3組為變量數(shù)據(jù),3組為測試數(shù)據(jù)%by akjuan%all rights preserved by %2008.11clcclear%-%原始數(shù)據(jù)%-year=1986:2000;%數(shù)據(jù)是從1986到2000年的p=493 372 445;372 445 176;445 176 235;176 235 378;235 378 429;.378 429 561;429 561 651;561 651 467;651 467 527;467 527 668;.527 668 841; 668 841 526;841 526 480;526 480 567;480 567 685;%輸入數(shù)據(jù),共15組,每組3個輸入t=176 235 378 429 561 651 467 527 668 841 526 480 567 685 507;%輸出數(shù)據(jù),共15組,每組1個輸出%-%數(shù)據(jù)歸一化處理%mapminmax函數(shù)默認將數(shù)據(jù)歸一化到-1,1,調(diào)用形式如下%y,ps =%mapminmax(x,ymin,ymax)%x需歸化的數(shù)據(jù)輸入%ymin,ymax為需歸化到的范圍,不填默認為歸化到-1,1%y歸一化后的樣本數(shù)據(jù)%ps處理設置,ps主要在結果反歸一化中需要調(diào)用,或者使用同樣的settings歸一化另外一組數(shù)據(jù)%-normInput,ps = mapminmax(p);normTarget,ts = mapminmax(t);%-%數(shù)據(jù)亂序,及分類處理%將輸入的15組數(shù)據(jù)的20%,即3組,用來作為測試數(shù)據(jù);% 樣本的20%,即3組,用來作為變化數(shù)據(jù);%另外9組用來正常輸入,用來訓練;%dividevec()用來重新隨機抽取上述三種分類的數(shù)據(jù),原來的順序被打亂%函數(shù)調(diào)用的語法%trainV,valV,testV = dividevec(p,t,valPercent,testPercent)%輸入p為輸入數(shù)據(jù),t為輸出數(shù)據(jù)%valPercent為訓練用的變化數(shù)據(jù)在總輸入中的百分比%testPercent為訓練用的測試數(shù)據(jù)在總輸入中的百分比%輸出trainV,valV,testV分別為按亂序及相應百分比,抽取得到的數(shù)據(jù)%另外,打亂后的數(shù)據(jù),p和t都是對應的,請放心使用%-testPercent = 0.20; % Adjust as desiredvalidatePercent = 0.20; % Adust as desiredtrainSamples,validateSamples,testSamples = dividevec(normInput,normTarget,validatePercent,testPercent);%-% 設置網(wǎng)絡參數(shù)%- NodeNum1 = 20; % 隱層第一層節(jié)點數(shù)NodeNum2=40; % 隱層第二層節(jié)點數(shù)TypeNum = 1; % 輸出維數(shù)TF1 = tansig;TF2 = tansig; TF3 = tansig;%各層傳輸函數(shù),TF3為輸出層傳輸函數(shù)%如果訓練結果不理想,可以嘗試更改傳輸函數(shù),以下這些是各類傳輸函數(shù)%TF1 = tansig;TF2 = logsig;%TF1 = logsig;TF2 = purelin;%TF1 = tansig;TF2 = tansig;%TF1 = logsig;TF2 = logsig;%TF1 = purelin;TF2 = purelin; %注意創(chuàng)建BP網(wǎng)絡函數(shù)newff()的參數(shù)調(diào)用,在新版本(7.6)中已改變net=newff(minmax(normInput),NodeNum1,NodeNum2,TypeNum,TF1 TF2 TF3,traingdx);%創(chuàng)建四層BP網(wǎng)絡%-% 設置訓練參數(shù)%- net.trainParam.epochs=10000;%訓練次數(shù)設置net.trainParam.goal=1e-6;%訓練目標設置net.trainParam.lr=0.01;%學習率設置,應設置為較少值,太大雖然會在開始加快收斂速度,但臨近最佳點時,會產(chǎn)生動蕩,而致使無法收斂%-% 指定訓練函數(shù)%-% net.trainFcn = traingd; % 梯度下降算法% net.trainFcn = traingdm; % 動量梯度下降算法% net.trainFcn = traingda; % 變學習率梯度下降算法% net.trainFcn = traingdx; % 變學習率動量梯度下降算法% (大型網(wǎng)絡的首選算法)% net.trainFcn = trainrp; % RPROP(彈性BP)算法,內(nèi)存需求最小% (共軛梯度算法)% net.trainFcn = traincgf; % Fletcher-Reeves修正算法% net.trainFcn = traincgp; % Polak-Ribiere修正算法,內(nèi)存需求比Fletcher-Reeves修正算法略大% net.trainFcn = traincgb; % Powell-Beal復位算法,內(nèi)存需求比Polak-Ribiere修正算法略大% (大型網(wǎng)絡的首選算法)%net.trainFcn = trainscg; % Scaled Conjugate Gradient算法,內(nèi)存需求與Fletcher-Reeves修正算法相同,計算量比上面三種算法都小很多% net.trainFcn = trainbfg; % Quasi-Newton Algorithms - BFGS Algorithm,計算量和內(nèi)存需求均比共軛梯度算法大,但收斂比較快% net.trainFcn = trainoss; % One Step Secant Algorithm,計算量和內(nèi)存需求均比BFGS算法小,比共軛梯度算法略大% (中型網(wǎng)絡的首選算法)%net.trainFcn = trainlm; % Levenberg-Marquardt算法,內(nèi)存需求最大,收斂速度最快% net.trainFcn = trainbr; % 貝葉斯正則化算法% 有代表性的五種算法為:traingdx,trainrp,trainscg,trainoss, trainlmnet.trainfcn=traingdm;net,tr = train(net,trainSamples.P,trainSamples.T,validateSamples,testSamples);%-% 訓練完成后,就可以調(diào)用sim()函數(shù),進行仿真了%- normTrainOutput,Pf,Af,E,trainPerf = sim(net,trainSamples.P,trainSamples.T);%正常輸入的9組p數(shù)據(jù),BP得到的結果tnormValidateOutput,Pf,Af,E,validatePerf = sim(net,validateSamples.P,validateSamples.T);%用作變量3的數(shù)據(jù)p,BP得到的結果tnormTestOutput,Pf,Af,E,testPerf = sim(net,testSamples.P,testSamples.T);%用作測試的3組數(shù)據(jù)p,BP得到的結果t%-% 仿真后結果數(shù)據(jù)反歸一化,如果需要預測,只需將預測的數(shù)據(jù)P填入% 將獲得預測結果t%-trainOutput = mapminmax(reverse,normTrainOutput,ts);%正常輸入的9組p數(shù)據(jù),BP得到的歸一化后的結果ttrainInsect = mapminmax(reverse,trainSamples.T,ts);%正常輸入的9組數(shù)據(jù)tvalidateOutput = mapminmax(reverse,normValidateOutput,ts);%用作變量3的數(shù)據(jù)p,BP得到的歸一化的結果tvalidateInsect = mapminmax(reverse,validateSamples.T,ts);%用作變量3的數(shù)據(jù)ttestOutput = mapminmax(reverse,normTestOutput,ts);%用作變量3組數(shù)據(jù)p,BP得到的歸一化的結果ttestInsect = mapminmax(reverse,testSamples.T,ts);%用作變量3組數(shù)據(jù)t%-% 數(shù)據(jù)分析和繪圖%-figureplot(1:12,trainOutput validateOutput,b-,1:12,trainInsect validateInsect,g-,13:15,testOutput,m*,13:15,testInsect,ro);title(o為真實值,*為預測值)xlabel(年份);ylabel(交通量(輛次/晝夜));DE運行后的結果如下圖,注意該程序是在7.0版本上實驗的,沒法在6.5版本運行,因為6.5版本的歸一化函數(shù)被遺棄了;在7.6以上版本沒有沒法運行,因為newff函數(shù)參數(shù)形式改變了。但是只要將上面提到部分相應修改下,就可以運行了正常數(shù)據(jù),是用來正常訓練用變量數(shù)據(jù),主要目的是防止訓練中出現(xiàn)過擬合狀態(tài)測試數(shù)據(jù),是用來看訓練效果的考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程(五)bp神經(jīng)網(wǎng)絡進行交通預測程序優(yōu)化本文考拉BP神經(jīng)網(wǎng)絡的matlab實現(xiàn)學習歷程系列由論壇超級版主akjuan整理和原創(chuàng),我們在此表示特別感謝在第四節(jié),給出的BP網(wǎng)絡進行交通預測的程序,是個基本模式,更改少數(shù)幾處參數(shù)后,可用于其它方面!但通過程序運行后,可以看出,預測效果并不理想,如何得到理想的預測訓練結果,下面是基本思路及matlab的實現(xiàn):1、設置一個誤差項,為測試數(shù)據(jù)的網(wǎng)絡仿真結果和實際結果偏差,并設置一個自己能接受的精度值2、每次訓練網(wǎng)絡后,將這個誤差和設置值比較,也可通過測試獲得網(wǎng)絡能給出的最高預測精度3、得到滿意訓練網(wǎng)絡后,保存BP結果,以便下次調(diào)用下面這個程序是在第四節(jié)程序基礎上優(yōu)化而來,可以運行前面的程序和這個程序,比較兩者的差別,可以通過修改eps來控制預測的誤差! 復制內(nèi)容到剪貼板 代碼:DE%bp神經(jīng)網(wǎng)絡進行交通預測的Matlab源代碼% BP 神經(jīng)網(wǎng)絡用于預測% 使用平臺 - Matlab7.0% 數(shù)據(jù)為1986年到2000年的交通量 ,網(wǎng)絡為3輸入,1輸出% 15組數(shù)據(jù),其中9組為正常訓練數(shù)據(jù),3組為變量數(shù)據(jù),3組為測試數(shù)據(jù)%by akjuan%all rights preserved by %2008.11clcclearAll_error=;%所有誤差存儲%-%原始數(shù)據(jù)%-year=1986:2000;%數(shù)據(jù)是從1986到2000年的p=493 372 445;372 445 176;445 176 235;176 235 378;235 378 429;.378 429 561;429 561 651;561 651 467;651 467 527;467 527 668;.527 668 841; 668 841 526;841 526 480;526 480 567;480 567 685;%輸入數(shù)據(jù),共15組,每組3個輸入t=176 235 378 429 561 651 467 527 668 841 526 480 567 685 507;%輸出數(shù)據(jù),共15組,每組1個輸出%-%數(shù)據(jù)歸一化處理%mapminmax函數(shù)默認將數(shù)據(jù)歸一化到-1,1,調(diào)用形式如下%y,ps =%mapminmax(x,ymin,ymax)%x需歸化的數(shù)據(jù)輸入%ymin,ymax為需歸化到的范圍,不填默認為歸化到-1,1%y歸一化后的樣本數(shù)據(jù)%ps處理設置,ps主要在結果反歸一化中需要調(diào)用,或者使用同樣的settings歸一化另外一組數(shù)據(jù)%-normInput,ps = mapminmax(p);normTarget,ts = mapminmax(t);%-%數(shù)據(jù)亂序,及分類處理%將輸入的15組數(shù)據(jù)的20%,即3組,用來作為測試數(shù)據(jù);% 樣本的20%,即3組,用來作為變化數(shù)據(jù);%另外9組用來正常輸入,用來訓練;%dividevec()用來重新隨機抽取上述三種分類的數(shù)據(jù),原來的順序被打亂%函數(shù)調(diào)用的語法%trainV,valV,testV = dividevec(p,t,valPercent,testPercent)%輸入p為輸入數(shù)據(jù),t為輸出數(shù)據(jù)%valPercent為訓練用的變化數(shù)據(jù)在總輸入中的百分比%testPercent為訓練用的測試數(shù)據(jù)在總輸入中的百分比%輸出trainV,valV,testV分別為按亂序及相應百分比,抽取得到的數(shù)據(jù)%另外,打亂后的數(shù)據(jù),p和t都是對應的,請放心使用%-testPercent = 0.20; % Adjust as desiredvalidatePercent = 0.20; % Adust as desiredtrainSamples,validateSamples,testSamples = dividevec(normInput,normTarget,validatePercent,testPercent);for j=1:200%-% 設置網(wǎng)絡參數(shù)%- NodeNum1 = 20; % 隱層第一層節(jié)點數(shù)NodeNum2=40; % 隱層第二層節(jié)點數(shù)TypeNum = 1; % 輸出維數(shù)TF1 = tansig;TF2 = tansig; TF3 = tansig;%各層傳輸函數(shù),TF3為輸出層傳輸函數(shù)%如果訓練結果不理想,可以嘗試更改傳輸函數(shù),以下這些是各類傳輸函數(shù)%TF1 = tansig;TF2 = logsig;%TF1 = logsig;TF2 = purelin;%TF1 = tansig;TF2 = tansig;%TF1 = logsig;TF2 = logsig;%TF1 = purelin;TF2 = purelin; net=newff(minmax(normInput),NodeNum1,NodeNum2,TypeNum,TF1 TF2 TF3,traingdx);%網(wǎng)絡創(chuàng)建%-% 設置訓練參數(shù)%- net.trainParam.epochs=10000;%訓練次數(shù)設置net.trainParam.goal=1e-6;%訓練目標設置net.trainParam.lr=0.01;%學習率設置,應設置為較少值,太大雖然會在開始加快收斂速度,但臨近最佳點時,會產(chǎn)生動蕩,而致使無法收斂%-% 指定訓練參數(shù)%-% net.trainFcn = traingd; % 梯度下降算法% net.trainFcn = traingdm; % 動量梯度下降算法% net.trainFcn = traingda; % 變學習率梯度下降算法% net.trainFcn = traingdx; % 變學習率動量梯度下降算法% (大型網(wǎng)絡的首選算法)% net.trainFcn = trainrp; % RPROP(彈性BP)算法,內(nèi)存需求最小% (共軛梯度算法)% net.trainFcn = traincgf; % Fletcher-Reeves修正算法% net.trainFcn = traincgp; % Polak-Ribiere修正算法,內(nèi)存需求比Fletcher-Reeves修正算法略大% net.trainFcn = traincgb; % Powell-Beal復位算法,內(nèi)存需求比Polak-Ribiere修正算法略大% (大型網(wǎng)絡的首選算法)%net.trainFcn = trainscg; % Scaled Conjugate Gradient算法,內(nèi)存需求與Fletcher-Reeves修正算法相同,計算量比上面三種算法都小很多% net.trainFcn = trainbfg; % Quasi-Newton Algorithms - BFGS Algorithm,計算

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論