如何利用matlab做BP神經網絡分析(利用matlab神經網絡工具箱)

  最近一段時間在研究如何利用預測其銷量個數,在網上搜索了一下,發現了很多模型來預測,比如利用迴歸模型、時間序列模型,GM(1,1)模型,可是自己在結合實際的工作內容,發現這幾種模型預測的精度不是很高,於是再在網上進行搜索,發現神經網絡模型可以來預測,並且有很多是結合時間序列或者SVM(支持向量機)等組合模型來進行預測,本文結合實際數據,選取了常用的BP神經網絡算法,其算法原理,因網上一大堆,所以在此不必一一展示,並參考了bp神經網絡進行交通預測的Matlab源代碼這篇博文,運用matlab 2016a,給出了下面的代碼,並最終進行了預測

clc

clear all

close all

%bp 神經網絡的預測代碼

%載入輸出和輸入數據

load C:\Users\amzon\Desktop\p.txt;

load C:\Users\amzon\Desktop\t.txt;

%保存數據到matlab的工作路徑裏面

save p.mat;

save t.mat;%注意t必須爲行向量

%賦值給輸出p和輸入t

p=p;

t=t;

%數據的歸一化處理,利用mapminmax函數,使數值歸一化到[-1.1]之間

%該函數使用方法如下:[y,ps] =mapminmax(x,ymin,ymax),x需歸化的數據輸入,

%ymin,ymax爲需歸化到的範圍,不填默認爲歸化到[-1,1]

%返回歸化後的值y,以及參數ps,ps在結果反歸一化中,需要調用

[p1,ps]=mapminmax(p);

[t1,ts]=mapminmax(t);

%確定訓練數據,測試數據,一般是隨機的從樣本中選取70%的數據作爲訓練數據

%15%的數據作爲測試數據,一般是使用函數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神經網絡,使用newff函數,其一般的使用方法如下

%net = newff(minmax(p),[隱層的神經元的個數,輸出層的神經元的個數],{隱層神經元的傳輸函數,輸出層的傳輸函數},'反向傳播的訓練函數'),其中p爲輸入數據,t爲輸出數據

%tf爲神經網絡的傳輸函數,默認爲'tansig'函數爲隱層的傳輸函數,

%purelin函數爲輸出層的傳輸函數

%一般在這裏還有其他的傳輸的函數一般的如下,如果預測出來的效果不是很好,可以調節

%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');%網絡創建

%網絡參數的設置

net.trainParam.epochs=10000;%訓練次數設置

net.trainParam.goal=1e-7;%訓練目標設置

net.trainParam.lr=0.01;%學習率設置,應設置爲較少值,太大雖然會在開始加快收斂速度,但臨近最佳點時,會產生動盪,而致使無法收斂

net.trainParam.mc=0.9;%動量因子的設置,默認爲0.9

net.trainParam.show=25;%顯示的間隔次數

% 指定訓練參數

% net.trainFcn = 'traingd'; % 梯度下降算法

% net.trainFcn = 'traingdm'; % 動量梯度下降算法

% net.trainFcn = 'traingda'; % 變學習率梯度下降算法

% net.trainFcn = 'traingdx'; % 變學習率動量梯度下降算法

% (大型網絡的首選算法)

% net.trainFcn = 'trainrp'; % RPROP(彈性BP)算法,內存需求最小

% 共軛梯度算法

% net.trainFcn = 'traincgf'; %Fletcher-Reeves修正算法

% net.trainFcn = 'traincgp'; %Polak-Ribiere修正算法,內存需求比Fletcher-Reeves修正算法略大

% net.trainFcn = 'traincgb'; % Powell-Beal復位算法,內存需求比Polak-Ribiere修正算法略大

% (大型網絡的首選算法)

%net.trainFcn = 'trainscg'; % ScaledConjugate Gradient算法,內存需求與Fletcher-Reeves修正算法相同,計算量比上面三種算法都小很多

% net.trainFcn = 'trainbfg'; %Quasi-Newton Algorithms - BFGS Algorithm,計算量和內存需求均比共軛梯度算法大,但收斂比較快

% net.trainFcn = 'trainoss'; % OneStep Secant Algorithm,計算量和內存需求均比BFGS算法小,比共軛梯度算法略大

% (中型網絡的首選算法)

%net.trainFcn = 'trainlm'; %Levenberg-Marquardt算法,內存需求最大,收斂速度最快

% net.trainFcn = 'trainbr'; % 貝葉斯正則化算法

% 有代表性的五種算法爲:'traingdx','trainrp','trainscg','trainoss', 'trainlm'

%在這裏一般是選取'trainlm'函數來訓練,其算對對應的是Levenberg-Marquardt算法

net.trainFcn='trainlm';

[net,tr]=train(net,trainsample.p,trainsample.t);

%計算仿真,其一般用sim函數

[normtrainoutput,trainPerf]=sim(net,trainsample.p,[],[],trainsample.t);%訓練的數據,根據BP得到的結果

[normvalidateoutput,validatePerf]=sim(net,valsample.p,[],[],valsample.t);%驗證的數據,經BP得到的結果

[normtestoutput,testPerf]=sim(net,testsample.p,[],[],testsample.t);%測試數據,經BP得到的結果

%將所得的結果進行反歸一化,得到其擬合的數據

trainoutput=mapminmax('reverse',normtrainoutput,ts);

validateoutput=mapminmax('reverse',normvalidateoutput,ts);

testoutput=mapminmax('reverse',normtestoutput,ts);

%正常輸入的數據的反歸一化的處理,得到其正式值

trainvalue=mapminmax('reverse',trainsample.t,ts);%正常的驗證數據

validatevalue=mapminmax('reverse',valsample.t,ts);%正常的驗證的數據

testvalue=mapminmax('reverse',testsample.t,ts);%正常的測試數據

%做預測,輸入要預測的數據pnew

pnew=[313,256,239]';

pnewn=mapminmax(pnew);

anewn=sim(net,pnewn);

anew=mapminmax('reverse',anewn,ts);

%絕對誤差的計算

errors=trainvalue-trainoutput;

%plotregression擬合圖

figure,plotregression(trainvalue,trainoutput)

%誤差圖

figure,plot(1:length(errors),errors,'-b')

title('誤差變化圖')

%誤差值的正態性的檢驗

figure,hist(errors);%頻數直方圖

figure,normplot(errors);%Q-Q圖

[muhat,sigmahat,muci,sigmaci]=normfit(errors);%參數估計 均值,方差,均值的0.95置信區間,方差的0.95置信區間

[h1,sig,ci]= ttest(errors,muhat);%假設檢驗

figure, ploterrcorr(errors);%繪製誤差的自相關圖

figure, parcorr(errors);%繪製偏相關圖

運行之後的,結果如下:

BP神經網絡的結果分析圖

訓練數據的梯度和均方誤差之間的關係圖

驗證數據的梯度與學習次數

殘差的正態的檢驗圖(Q-Q圖)

 

 

在網上,發現可以通過神經網絡工具箱這個GUI界面來創建神經網絡,其一般的操作步驟如下:

1:在輸入命令裏面輸入nntool命令,或者在應用程序這個選項下找到Netrual Net Fitting 這個應用程序,點擊打開,就能看見如下界面

 

 

 

2:輸入數據和輸出數據的導入(在本文中選取了matlab自帶的案例數據)


3:隨機選擇三種類型的數據所佔的樣本量的比例,一般選取默認即可
 



4:隱層神經元的確定
                                                                              


5:訓練算法的選取,一般是選擇默認即可,選擇完成後點擊<train>按鈕即可運行程序




6:根據得到的結果,一般是MSE的值越小,R值越接近1,其訓練的效果比較,並第二張圖給出了神經網絡的各參數的設置以及其最終的結果,其擬合圖R越接近1,模型擬合的更好








最終的結果圖

7:如果所得到的模型不能滿足你的需求,則需重複上述的步驟直至能夠得到你想要的精確度

8:將最終的得到的各種數據以及其擬合值進行保存,然後查看,就可以得到所要的擬合值



最後參考了網上和MATLAB的幫助,給出了一些與神經網絡相關的函數,希望能夠幫助大家。。
 圖形用戶界面功能。 
    nnstart - 神經網絡啓動GUI 
    nctool - 神經網絡分類工具 
    nftool - 神經網絡的擬合工具 
    nntraintool - 神經網絡的訓練工具 
    nprtool - 神經網絡模式識別工具 
    ntstool - NFTool神經網絡時間序列的工具 
    nntool - 神經網絡工具箱的圖形用戶界面。 
    查看 - 查看一個神經網絡。 
  
  網絡的建立功能。 
    cascadeforwardnet - 串級,前饋神經網絡。 
    competlayer - 競爭神經層。 
    distdelaynet - 分佈時滯的神經網絡。 
    elmannet - Elman神經網絡。 
    feedforwardnet - 前饋神經網絡。 
    fitnet - 函數擬合神經網絡。 
    layrecnet - 分層遞歸神經網絡。 
    linearlayer - 線性神經層。 
    lvqnet - 學習矢量量化(LVQ)神經網絡。 
    narnet - 非線性自結合的時間序列網絡。 
    narxnet - 非線性自結合的時間序列與外部輸入網絡。 
    newgrnn - 設計一個廣義迴歸神經網絡。 
    newhop - 建立經常性的Hopfield網絡。 
    newlind - 設計一個線性層。 
    newpnn - 設計概率神經網絡。 
    newrb - 徑向基網絡設計。 
    newrbe - 設計一個確切的徑向基網絡。 
    patternnet - 神經網絡模式識別。 
    感知 - 感知。 
    selforgmap - 自組織特徵映射。 
    timedelaynet - 時滯神經網絡。 
  
  利用網絡。 
    網絡 - 創建一個自定義神經網絡。 
    SIM卡 - 模擬一個神經網絡。 
    初始化 - 初始化一個神經網絡。 
    適應 - 允許一個神經網絡來適應。 
    火車 - 火車的神經網絡。 
    DISP鍵 - 顯示一個神經網絡的屬性。 
    顯示 - 顯示的名稱和神經網絡屬性 
    adddelay - 添加延遲神經網絡的反應。 
    closeloop - 神經網絡的開放反饋轉換到關閉反饋迴路。 
    formwb - 表格偏見和成單個向量的權重。 
    getwb - 將它作爲一個單一向量中的所有網絡權值和偏差。 
    noloop - 刪除神經網絡的開放和關閉反饋迴路。 
    開環 - 轉換神經網絡反饋,打開封閉的反饋循環。 
    removedelay - 刪除延遲神經網絡的反應。 
    separatewb - 獨立的偏見和重量/偏置向量的權重。 
    setwb - 將所有與單個矢量網絡權值和偏差。 
  
  Simulink的支持。 
    gensim - 生成Simulink模塊來模擬神經網絡。 
    setsiminit - 集神經網絡的Simulink模塊的初始條件 
    getsiminit - 獲取神經網絡Simulink模塊的初始條件 
    神經元 - 神經網絡Simulink的模塊庫。 
  
  培訓職能。 
    trainb - 批具有重量與偏見學習規則的培訓。 
    trainbfg - 的BFGS擬牛頓倒傳遞。 
    trainbr - 貝葉斯規則的BP算法。 
    trainbu - 與重量與偏見一批無監督學習規則的培訓。 
    trainbuwb - 與體重無監督學習規則與偏見一批培訓。 
    trainc - 循環順序重量/偏見的培訓。 
    traincgb - 共軛鮑威爾比爾重新啓動梯度反向傳播。 
    traincgf - 共軛弗萊徹-裏夫斯更新梯度反向傳播。 
    traincgp - 共軛波拉克- Ribiere更新梯度反向傳播。 
    traingd - 梯度下降反向傳播。 
    traingda - 具有自適應LR的反向傳播梯度下降。 
    traingdm - 與動量梯度下降。 
    traingdx - 梯度下降瓦特/慣性與自適應LR的反向傳播。 
    trainlm - 採用Levenberg -馬奎德倒傳遞。 
    trainoss - 一步割線倒傳遞。 
    trainr - 隨機重量/偏見的培訓。 
    trainrp - RPROP反向傳播。 
    trainru - 無監督隨機重量/偏見的培訓。 
    火車 - 順序重量/偏見的培訓。 
    trainscg - 規模化共軛梯度BP算法。 
  
  繪圖功能。 
    plotconfusion - 圖分類混淆矩陣。 
    ploterrcorr - 誤差自相關時間序列圖。 
    ploterrhist - 繪製誤差直方圖。 
    plotfit - 繪圖功能適合。 
    plotinerrcorr - 圖輸入錯誤的時間序列的互相關。 
    plotperform - 小區網絡性能。 
    plotregression - 線性迴歸情節。 
    plotresponse - 動態網絡圖的時間序列響應。 
    plotroc - 繪製受試者工作特徵。 
    plotsomhits - 小區自組織圖來樣打。 
    plotsomnc - 小區自組織映射鄰居的連接。 
    plotsomnd - 小區自組織映射鄰居的距離。 
    plotsomplanes - 小區自組織映射重量的飛機。 
    plotsompos - 小區自組織映射重量立場。 
    plotsomtop - 小區自組織映射的拓撲結構。 
    plottrainstate - 情節訓練狀態值。 
    plotwb - 圖寒春重量和偏差值圖。 
  
  列出其他神經網絡實現的功能。 
    nnadapt - 適應職能。 
    nnderivati​​ve - 衍生功能。 
    nndistance - 距離函數。 
    nndivision - 除功能。 
    nninitlayer - 初始化層功能。 
    nninitnetwork - 初始化網絡功能。 
    nninitweight - 初始化權函數。 
    nnlearn - 學習功能。 
    nnnetinput - 淨輸入功能。 
    nnperformance - 性能的功能。 
    nnprocess - 處理功能。 
    nnsearch - 線搜索功能。 
    nntopology - 拓撲結構的功能。 
    nntransfer - 傳遞函數。 
    nnweight - 重量的功能。 
 nndemos - 神經網絡工具箱的示威。 
    nndatasets - 神經網絡工具箱的數據集。 
    nntextdemos - 神經網絡設計教科書的示威。 
    nntextbook - 神經網絡設計教科書的資訊。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章