生活随笔
收集整理的這篇文章主要介紹了
如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如何利用matlab做BP神經(jīng)網(wǎng)絡(luò)分析(包括利用matlab神經(jīng)網(wǎng)絡(luò)工具箱)
轉(zhuǎn)載:https://blog.csdn.net/xgxyxs/article/details/53265318
最近一段時(shí)間在研究如何利用預(yù)測(cè)其銷(xiāo)量個(gè)數(shù),在網(wǎng)上搜索了一下,發(fā)現(xiàn)了很多模型來(lái)預(yù)測(cè),比如利用回歸模型、時(shí)間序列模型,GM(1,1)模型,可是自己在結(jié)合實(shí)際的工作內(nèi)容,發(fā)現(xiàn)這幾種模型預(yù)測(cè)的精度不是很高,于是再在網(wǎng)上進(jìn)行搜索,發(fā)現(xiàn)神經(jīng)網(wǎng)絡(luò)模型可以來(lái)預(yù)測(cè),并且有很多是結(jié)合時(shí)間序列或者SVM(支持向量機(jī))等組合模型來(lái)進(jìn)行預(yù)測(cè),本文結(jié)合實(shí)際數(shù)據(jù),選取了常用的BP神經(jīng)網(wǎng)絡(luò)算法,其算法原理,因網(wǎng)上一大堆,所以在此不必一一展示,并參考了bp神經(jīng)網(wǎng)絡(luò)進(jìn)行交通預(yù)測(cè)的Matlab源代碼這篇博文,運(yùn)用matlab 2016a,給出了下面的代碼,并最終進(jìn)行了預(yù)測(cè)
clc clear all close all %bp 神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)代碼 %載入輸出和輸入數(shù)據(jù) load C:\Users\amzon\Desktop\p.txt; load C:\Users\amzon\Desktop\t.txt; %保存數(shù)據(jù)到matlab的工作路徑里面 save p.mat; save t.mat;%注意t必須為行向量 %賦值給輸出p和輸入t p=p; t=t; %數(shù)據(jù)的歸一化處理,利用mapminmax函數(shù),使數(shù)值歸一化到[-1.1]之間 %該函數(shù)使用方法如下:[y,ps] =mapminmax(x,ymin,ymax),x需歸化的數(shù)據(jù)輸入, %ymin,ymax為需歸化到的范圍,不填默認(rèn)為歸化到[-1,1] %返回歸化后的值y,以及參數(shù)ps,ps在結(jié)果反歸一化中,需要調(diào)用 [p1,ps]=mapminmax(p); [t1,ts]=mapminmax(t); %確定訓(xùn)練數(shù)據(jù),測(cè)試數(shù)據(jù),一般是隨機(jī)的從樣本中選取70%的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù) %15%的數(shù)據(jù)作為測(cè)試數(shù)據(jù),一般是使用函數(shù)dividerand,其一般的使用方法如下: %[trainInd,valInd,testInd] = dividerand(Q,trainRatio,valRatio,testRatio) [trainsample.p,valsample.p,testsample.p] =dividerand(p,0.7,0.15,0.15); [trainsample.t,valsample.t,testsample.t] =dividerand(t,0.7,0.15,0.15); %建立反向傳播算法的BP神經(jīng)網(wǎng)絡(luò),使用newff函數(shù),其一般的使用方法如下 %net = newff(minmax(p),[隱層的神經(jīng)元的個(gè)數(shù),輸出層的神經(jīng)元的個(gè)數(shù)],{隱層神經(jīng)元的傳輸函數(shù),輸出層的傳輸函數(shù)},'反向傳播的訓(xùn)練函數(shù)'),其中p為輸入數(shù)據(jù),t為輸出數(shù)據(jù) %tf為神經(jīng)網(wǎng)絡(luò)的傳輸函數(shù),默認(rèn)為'tansig'函數(shù)為隱層的傳輸函數(shù), %purelin函數(shù)為輸出層的傳輸函數(shù) %一般在這里還有其他的傳輸?shù)暮瘮?shù)一般的如下,如果預(yù)測(cè)出來(lái)的效果不是很好,可以調(diào)節(jié) %TF1 = 'tansig';TF2 = 'logsig'; %TF1 = 'logsig';TF2 = 'purelin'; %TF1 = 'logsig';TF2 = 'logsig'; %TF1 = 'purelin';TF2 = 'purelin'; TF1='tansig';TF2='purelin'; net=newff(minmax(p),[10,1],{TF1 TF2},'traingdm');%網(wǎng)絡(luò)創(chuàng)建 %網(wǎng)絡(luò)參數(shù)的設(shè)置 net.trainParam.epochs=10000;%訓(xùn)練次數(shù)設(shè)置 net.trainParam.goal=1e-7;%訓(xùn)練目標(biāo)設(shè)置 net.trainParam.lr=0.01;%學(xué)習(xí)率設(shè)置,應(yīng)設(shè)置為較少值,太大雖然會(huì)在開(kāi)始加快收斂速度,但臨近最佳點(diǎn)時(shí),會(huì)產(chǎn)生動(dòng)蕩,而致使無(wú)法收斂 net.trainParam.mc=0.9;%動(dòng)量因子的設(shè)置,默認(rèn)為0.9 net.trainParam.show=25;%顯示的間隔次數(shù) % 指定訓(xùn)練參數(shù) % net.trainFcn = 'traingd'; % 梯度下降算法 % net.trainFcn = 'traingdm'; % 動(dòng)量梯度下降算法 % net.trainFcn = 'traingda'; % 變學(xué)習(xí)率梯度下降算法 % net.trainFcn = 'traingdx'; % 變學(xué)習(xí)率動(dòng)量梯度下降算法 % (大型網(wǎng)絡(luò)的首選算法) % 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復(fù)位算法,內(nèi)存需求比Polak-Ribiere修正算法略大 % (大型網(wǎng)絡(luò)的首選算法) %net.trainFcn = 'trainscg'; % ScaledConjugate Gradient算法,內(nèi)存需求與Fletcher-Reeves修正算法相同,計(jì)算量比上面三種算法都小很多 % net.trainFcn = 'trainbfg'; %Quasi-Newton Algorithms - BFGS Algorithm,計(jì)算量和內(nèi)存需求均比共軛梯度算法大,但收斂比較快 % net.trainFcn = 'trainoss'; % OneStep Secant Algorithm,計(jì)算量和內(nèi)存需求均比BFGS算法小,比共軛梯度算法略大 % (中型網(wǎng)絡(luò)的首選算法) %net.trainFcn = 'trainlm'; %Levenberg-Marquardt算法,內(nèi)存需求最大,收斂速度最快 % net.trainFcn = 'trainbr'; % 貝葉斯正則化算法 % 有代表性的五種算法為:'traingdx','trainrp','trainscg','trainoss', 'trainlm' %在這里一般是選取'trainlm'函數(shù)來(lái)訓(xùn)練,其算對(duì)對(duì)應(yīng)的是Levenberg-Marquardt算法 net.trainFcn='trainlm'; [net,tr]=train(net,trainsample.p,trainsample.t); %計(jì)算仿真,其一般用sim函數(shù) [normtrainoutput,trainPerf]=sim(net,trainsample.p,[],[],trainsample.t);%訓(xùn)練的數(shù)據(jù),根據(jù)BP得到的結(jié)果 [normvalidateoutput,validatePerf]=sim(net,valsample.p,[],[],valsample.t);%驗(yàn)證的數(shù)據(jù),經(jīng)BP得到的結(jié)果 [normtestoutput,testPerf]=sim(net,testsample.p,[],[],testsample.t);%測(cè)試數(shù)據(jù),經(jīng)BP得到的結(jié)果 %將所得的結(jié)果進(jìn)行反歸一化,得到其擬合的數(shù)據(jù) trainoutput=mapminmax('reverse',normtrainoutput,ts); validateoutput=mapminmax('reverse',normvalidateoutput,ts); testoutput=mapminmax('reverse',normtestoutput,ts); %正常輸入的數(shù)據(jù)的反歸一化的處理,得到其正式值 trainvalue=mapminmax('reverse',trainsample.t,ts);%正常的驗(yàn)證數(shù)據(jù) validatevalue=mapminmax('reverse',valsample.t,ts);%正常的驗(yàn)證的數(shù)據(jù) testvalue=mapminmax('reverse',testsample.t,ts);%正常的測(cè)試數(shù)據(jù) %做預(yù)測(cè),輸入要預(yù)測(cè)的數(shù)據(jù)pnew pnew=[313,256,239]';pnewn=mapminmax(pnew);anewn=sim(net,pnewn);anew=mapminmax('reverse',anewn,ts);%絕對(duì)誤差的計(jì)算errors=trainvalue-trainoutput;%plotregression擬合圖figure,plotregression(trainvalue,trainoutput)%誤差圖figure,plot(1:length(errors),errors,'-b')title('誤差變化圖')%誤差值的正態(tài)性的檢驗(yàn)figure,hist(errors);%頻數(shù)直方圖figure,normplot(errors);%Q-Q圖[muhat,sigmahat,muci,sigmaci]=normfit(errors);%參數(shù)估計(jì) 均值,方差,均值的0.95置信區(qū)間,方差的0.95置信區(qū)間[h1,sig,ci]= ttest(errors,muhat);%假設(shè)檢驗(yàn)figure, ploterrcorr(errors);%繪制誤差的自相關(guān)圖figure, parcorr(errors);%繪制偏相關(guān)圖
運(yùn)行之后的,結(jié)果如下:
BP神經(jīng)網(wǎng)絡(luò)的結(jié)果分析圖
訓(xùn)練數(shù)據(jù)的梯度和均方誤差之間的關(guān)系圖
驗(yàn)證數(shù)據(jù)的梯度與學(xué)習(xí)次數(shù)
殘差的正態(tài)的檢驗(yàn)圖(Q-Q圖)
?
?
在網(wǎng)上,發(fā)現(xiàn)可以通過(guò)神經(jīng)網(wǎng)絡(luò)工具箱這個(gè)GUI界面來(lái)創(chuàng)建神經(jīng)網(wǎng)絡(luò),其一般的操作步驟如下:
1:在輸入命令里面輸入nntool命令,或者在應(yīng)用程序這個(gè)選項(xiàng)下找到Netrual Net Fitting 這個(gè)應(yīng)用程序,點(diǎn)擊打開(kāi),就能看見(jiàn)如下界面
?
?
?
2:輸入數(shù)據(jù)和輸出數(shù)據(jù)的導(dǎo)入(在本文中選取了matlab自帶的案例數(shù)據(jù))
3:隨機(jī)選擇三種類(lèi)型的數(shù)據(jù)所占的樣本量的比例,一般選取默認(rèn)即可
4:隱層神經(jīng)元的確定
?????????????????????????????????????????????????????????????????????????????
5:訓(xùn)練算法的選取,一般是選擇默認(rèn)即可,選擇完成后點(diǎn)擊<train>按鈕即可運(yùn)行程序
6:根據(jù)得到的結(jié)果,一般是MSE的值越小,R值越接近1,其訓(xùn)練的效果比較,并第二張圖給出了神經(jīng)網(wǎng)絡(luò)的各參數(shù)的設(shè)置以及其最終的結(jié)果,其擬合圖R越接近1,模型擬合的更好
最終的結(jié)果圖
7:如果所得到的模型不能滿足你的需求,則需重復(fù)上述的步驟直至能夠得到你想要的精確度
8:將最終的得到的各種數(shù)據(jù)以及其擬合值進(jìn)行保存,然后查看,就可以得到所要的擬合值
MATLAB 與神經(jīng)網(wǎng)絡(luò)相關(guān)的函數(shù)總結(jié)如下:
圖形用戶(hù)界面功能nnstart - 神經(jīng)網(wǎng)絡(luò)啟動(dòng)GUI?nctool - 神經(jīng)網(wǎng)絡(luò)分類(lèi)工具?nftool - 神經(jīng)網(wǎng)絡(luò)的擬合工具?nntraintool - 神經(jīng)網(wǎng)絡(luò)的訓(xùn)練工具?nprtool - 神經(jīng)網(wǎng)絡(luò)模式識(shí)別工具?ntstool - NFTool神經(jīng)網(wǎng)絡(luò)時(shí)間序列的工具?nntool - 神經(jīng)網(wǎng)絡(luò)工具箱的圖形用戶(hù)界面。?查看 - 查看一個(gè)神經(jīng)網(wǎng)絡(luò)。?網(wǎng)絡(luò)的建立功能cascadeforwardnet - 串級(jí),前饋神經(jīng)網(wǎng)絡(luò)。?competlayer - 競(jìng)爭(zhēng)神經(jīng)層。?distdelaynet - 分布時(shí)滯的神經(jīng)網(wǎng)絡(luò)。?elmannet - Elman神經(jīng)網(wǎng)絡(luò)。?feedforwardnet - 前饋神經(jīng)網(wǎng)絡(luò)。?fitnet - 函數(shù)擬合神經(jīng)網(wǎng)絡(luò)。?layrecnet - 分層遞歸神經(jīng)網(wǎng)絡(luò)。?linearlayer - 線性神經(jīng)層。?lvqnet - 學(xué)習(xí)矢量量化(LVQ)神經(jīng)網(wǎng)絡(luò)。?narnet - 非線性自結(jié)合的時(shí)間序列網(wǎng)絡(luò)。?narxnet - 非線性自結(jié)合的時(shí)間序列與外部輸入網(wǎng)絡(luò)。?newgrnn - 設(shè)計(jì)一個(gè)廣義回歸神經(jīng)網(wǎng)絡(luò)。?newhop - 建立經(jīng)常性的Hopfield網(wǎng)絡(luò)。?newlind - 設(shè)計(jì)一個(gè)線性層。?newpnn - 設(shè)計(jì)概率神經(jīng)網(wǎng)絡(luò)。?newrb - 徑向基網(wǎng)絡(luò)設(shè)計(jì)。?newrbe - 設(shè)計(jì)一個(gè)確切的徑向基網(wǎng)絡(luò)。?patternnet - 神經(jīng)網(wǎng)絡(luò)模式識(shí)別。?感知 - 感知。?selforgmap - 自組織特征映射。?timedelaynet - 時(shí)滯神經(jīng)網(wǎng)絡(luò)。?利用網(wǎng)絡(luò)網(wǎng)絡(luò) - 創(chuàng)建一個(gè)自定義神經(jīng)網(wǎng)絡(luò)。?SIM卡 - 模擬一個(gè)神經(jīng)網(wǎng)絡(luò)。?初始化 - 初始化一個(gè)神經(jīng)網(wǎng)絡(luò)。?適應(yīng) - 允許一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)適應(yīng)。?火車(chē) - 火車(chē)的神經(jīng)網(wǎng)絡(luò)。?DISP鍵 - 顯示一個(gè)神經(jīng)網(wǎng)絡(luò)的屬性。?顯示 - 顯示的名稱(chēng)和神經(jīng)網(wǎng)絡(luò)屬性?adddelay - 添加延遲神經(jīng)網(wǎng)絡(luò)的反應(yīng)。?closeloop - 神經(jīng)網(wǎng)絡(luò)的開(kāi)放反饋轉(zhuǎn)換到關(guān)閉反饋回路。?formwb - 表格偏見(jiàn)和成單個(gè)向量的權(quán)重。?getwb - 將它作為一個(gè)單一向量中的所有網(wǎng)絡(luò)權(quán)值和偏差。?noloop - 刪除神經(jīng)網(wǎng)絡(luò)的開(kāi)放和關(guān)閉反饋回路。?開(kāi)環(huán) - 轉(zhuǎn)換神經(jīng)網(wǎng)絡(luò)反饋,打開(kāi)封閉的反饋循環(huán)。?removedelay - 刪除延遲神經(jīng)網(wǎng)絡(luò)的反應(yīng)。?separatewb - 獨(dú)立的偏見(jiàn)和重量/偏置向量的權(quán)重。?setwb - 將所有與單個(gè)矢量網(wǎng)絡(luò)權(quán)值和偏差。?Simulink的支持gensim - 生成Simulink模塊來(lái)模擬神經(jīng)網(wǎng)絡(luò)。?setsiminit - 集神經(jīng)網(wǎng)絡(luò)的Simulink模塊的初始條件?getsiminit - 獲取神經(jīng)網(wǎng)絡(luò)Simulink模塊的初始條件?神經(jīng)元 - 神經(jīng)網(wǎng)絡(luò)Simulink的模塊庫(kù)。?trainb - 批具有重量與偏見(jiàn)學(xué)習(xí)規(guī)則的培訓(xùn)。?trainbfg - 的BFGS擬牛頓倒傳遞。?trainbr - 貝葉斯規(guī)則的BP算法。?trainbu - 與重量與偏見(jiàn)一批無(wú)監(jiān)督學(xué)習(xí)規(guī)則的培訓(xùn)。?trainbuwb - 與體重?zé)o監(jiān)督學(xué)習(xí)規(guī)則與偏見(jiàn)一批培訓(xùn)。?trainc - 循環(huán)順序重量/偏見(jiàn)的培訓(xùn)。?traincgb - 共軛鮑威爾比爾重新啟動(dòng)梯度反向傳播。?traincgf - 共軛弗萊徹-里夫斯更新梯度反向傳播。?traincgp - 共軛波拉克- Ribiere更新梯度反向傳播。?traingd - 梯度下降反向傳播。?traingda - 具有自適應(yīng)LR的反向傳播梯度下降。?traingdm - 與動(dòng)量梯度下降。?traingdx - 梯度下降瓦特/慣性與自適應(yīng)LR的反向傳播。?trainlm - 采用Levenberg -馬奎德倒傳遞。?trainoss - 一步割線倒傳遞。?trainr - 隨機(jī)重量/偏見(jiàn)的培訓(xùn)。?trainrp - RPROP反向傳播。?trainru - 無(wú)監(jiān)督隨機(jī)重量/偏見(jiàn)的培訓(xùn)。?火車(chē) - 順序重量/偏見(jiàn)的培訓(xùn)。?trainscg - 規(guī)模化共軛梯度BP算法。?繪圖功能plotconfusion - 圖分類(lèi)混淆矩陣。?ploterrcorr - 誤差自相關(guān)時(shí)間序列圖。?ploterrhist - 繪制誤差直方圖。?plotfit - 繪圖功能適合。?plotinerrcorr - 圖輸入錯(cuò)誤的時(shí)間序列的互相關(guān)。?plotperform - 小區(qū)網(wǎng)絡(luò)性能。?plotregression - 線性回歸情節(jié)。?plotresponse - 動(dòng)態(tài)網(wǎng)絡(luò)圖的時(shí)間序列響應(yīng)。?plotroc - 繪制受試者工作特征。?plotsomhits - 小區(qū)自組織圖來(lái)樣打。?plotsomnc - 小區(qū)自組織映射鄰居的連接。?plotsomnd - 小區(qū)自組織映射鄰居的距離。?plotsomplanes - 小區(qū)自組織映射重量的飛機(jī)。?plotsompos - 小區(qū)自組織映射重量立場(chǎng)。?plotsomtop - 小區(qū)自組織映射的拓?fù)浣Y(jié)構(gòu)。?plottrainstate - 情節(jié)訓(xùn)練狀態(tài)值。?plotwb - 圖寒春重量和偏差值圖。?列出其他神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)的功能nnadapt - 適應(yīng)職能。?nnderivati??ve - 衍生功能。?nndistance - 距離函數(shù)。?nndivision - 除功能。?nninitlayer - 初始化層功能。?nninitnetwork - 初始化網(wǎng)絡(luò)功能。?nninitweight - 初始化權(quán)函數(shù)。?nnlearn - 學(xué)習(xí)功能。?nnnetinput - 凈輸入功能。?nnperformance - 性能的功能。?nnprocess - 處理功能。?nnsearch - 線搜索功能。?nntopology - 拓?fù)浣Y(jié)構(gòu)的功能。?nntransfer - 傳遞函數(shù)。?nnweight - 重量的功能。?nndemos - 神經(jīng)網(wǎng)絡(luò)工具箱的示威。?nndatasets - 神經(jīng)網(wǎng)絡(luò)工具箱的數(shù)據(jù)集。?nntextdemos - 神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)教科書(shū)的示威。?nntextbook - 神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)教科書(shū)的資訊。?
?
?
Save
?
總結(jié)
以上是生活随笔為你收集整理的如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。