[Matlab]BP神經網路預測[1]

本文針對新手,大神慎入!

Preface

網上很多講神經網路的,我也看了很多,就是沒搞懂過,尤其是MATLAB的代碼實現,一直搞不懂MATLAB怎麼實現的,最近做完了一個BP預測的,我想仔細的、愉快的講講MATLAB在神經網路模式識別方面的實現。文章持續更新。

What is Back Propagation Neural NetWorks?

想了一年的神經網路也沒搞明白這玩意是怎麼實現人工智慧,也不知道MATLAB那些代碼怎麼用的,這裡我就簡單講一下,先理解這是一個能實現什麼的東西,至於怎麼實現的,以後再講。

假如你是一個機智的土豆大亨,你認識10個農場的大佬,他們分別給了你一個蘋果和一支筆。

對此你需要分別給他們一個土豆,但這個土豆的大小你總取決於對方的蘋果和筆的質量,蘋果又大又甜筆是高檔的你當然就給的土豆更大更好,正如假設的一樣,你是一個機智的土豆大亨,下個禮拜又有幾個國外大佬想和你交換土豆,但你不想自己再計算他們的蘋果和筆到底值一個多大的土豆了,但是呢你的數學不好,你也不想建立一個具體的函數來計算土豆和蘋果筆之間的關係,但你有一個BP神經機器,你只要訓練他一段時間,以後他就會了。比如你告訴他寫"1"就是寫一橫,「2」寫兩橫,「3」寫三橫,『1、2、3』作為輸入,"橫的數量作為輸出,然後訓練』,你用這個樣本來訓練他,然後有一天另一個人問他『1』怎麼寫,他就會划上一橫,但如果問他『一萬』怎麼寫他可能畫上一萬橫,聽起來有些滑稽。好了,你有這麼一個機器,現在你有10個蘋果10隻筆,你也計算好了應該拿多重的土豆作為回應蘋果筆了,你以後不想再自己計算了,你想給這個機器一個蘋果一個筆他就預測一個合適土豆出來,但這之前,你要用這10個樣本來訓練這個機器,建立一個合適的網路,啊呀,好像有點跑偏,那直接實戰吧。

How to achieve BPNN by using Matlab

通過蘋果筆的重量及價格我們可以算出對應的土豆的重量,

banana=[1 2 3 1 2 3 4 5 6 2 ]; %假設香蕉1塊錢一斤pen=[2 3 7 2 3 4 5 3 9 2 ];%筆兩塊錢一斤potato_actual=(banana*1+pen*2)/3;%土豆三塊錢一斤potato_actual=[1.6 2.6 5.6 1.6 2.6 3.6 4.6 3.6 8.0 2.0];%土豆的準確重量

在把樣本給BP神經網路之前通常要歸一化處理。

[input,ps1]=mapminmax([banana;pen]);%兩行十列[target,ps2]=mapminmax([potato_actual]); %一行十列%這裡的ps1,2是這個歸一化操作的種子,之後我們要用這個進行逆操作

我們可以交給神經網路了,輸入變數一共是2個,輸出變數是土豆重量,樣本數10個,所以輸入層神經元個數為2,輸出層神經元個數1個,通常MATLAB默認三層神經元,即輸入層,輸出層,他們兩中間有個隱含層。我們設置隱含層神經個數為6個,隱含層轉移函數:『tansig』,輸出層轉移函數:"purelin",訓練函數:『traninbr』。如下

net=newff(input,target,6,{"tansig","purelin"},"trainlm");%% 講講這個創建BP神經網路的函數請 doc newff %{Description newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF) takes optional inputs, TFi - Transfer function of ith layer. Default is "tansig" for hidden layers, and "purelin" for output layer. BTF - Backprop network training function, default = "trainlm". BLF - Backprop weight/bias learning function, default = "learngdm". PF - Performance function, default = "mse". IPF - Row cell array of input processing functions. Default is {"fixunknowns","remconstantrows","mapminmax"}. OPF - Row cell array of output processing functions. Default is {"remconstantrows","mapminmax"}. DDF - Data division function, default = "dividerand"; and returns an N layer feed-forward backprop network.%}

創建好了,我們來設置一些參數:

net.trainParam.epochs=1000; %最大訓練次數net.trainParam.goal=0.00001;%目標最小誤差LP.lr=0.000001;%學習速率

讓我們來訓練它:

net=train(net,input,target);

這個時候就出現了這個:

我們點開Performance,顯示訓練了三回誤差就達到預設值了。

我們來用這個網路來預測,假設又來了一些蘋果筆,看它預測的土豆對不對。

banana1=[2 1 3 5 9 9]; %假設香蕉1塊錢一斤pen1=[1 2 8 2 10 3];%筆兩塊錢一斤potato_actual1=(banana1*1+pen1*2)/3;%土豆三塊錢一斤input1=mapminmax("apply",[banana1;pen1],ps1);%應用之前的種子歸一化%預測output1=net(input1);prediction1=mapminmax("reverse",output1,ps2);%讓我們做出預測值與實際值的圖像set(0,"defaultfigurecolor","w")figureplot(potato_actual1,"*","color",[222 87 18]/255);hold onplot(prediction1,"-o","color",[244 208 0]/255,..."linewidth",2,"MarkerSize",14,"MarkerEdgecolor",[138 151 123]/255);legend("actua value","prediction1"),title("預測其他數據")xlabel("potato1"),ylabel("weight")%使得坐標圖優美 set(gca, "Box", "off", "TickDir", "out", "TickLength", [.02 .02], ... "XMinorTick", "on", "YMinorTick", "on", "YGrid", "on", ... "XColor", [.3 .3 .3], "YColor", [.3 .3 .3],"LineWidth", 1)%如果是預測本身呢?figureoutput=net(input);prediction=mapminmax("reverse",output,ps2);%讓我們做出預測值與實際值的圖像plot(potato_actual,"*","color",[29 131 8]/255);hold onplot(prediction,"-o","color",[244 208 0]/255,..."linewidth",2,"MarkerSize",14,"MarkerEdgecolor",[138 151 123]/255);legend("actua value","prediction")title("預測本身10個數據")%使得坐標圖優美xlabel("potato"),ylabel("weight") set(gca, "Box", "off", "TickDir", "out", "TickLength", [.02 .02], ... "XMinorTick", "on", "YMinorTick", "on", "YGrid", "on", ... "XColor", [.3 .3 .3], "YColor", [.3 .3 .3],"LineWidth", 1)

結果如下:

當你給他別的蘋果筆時BP回復你的重量與時間應該給的重量

當你給訓練用的蘋果筆時BP回復你的重量與時間應該給的重量

BP預測結果分析:

顯然,用給他訓練的數據來預測本身預測的準確性要高的多,但這可能沒有太大的意義,可以將目標誤差設的更小,加大訓練樣本等方式,提高預測模型的通用性

這裡我們用工具箱實現了一個簡單的bp預測,但你可能還不懂數學原理,這是下一次要重點講的,今天就到這。謝謝!

全部源代碼:

banana=[1 2 3 1 2 3 4 5 6 2 ]; %假設香蕉1塊錢一斤pen=[2 3 7 2 3 4 5 3 9 2 ];%筆兩塊錢一斤potato_actual=(banana*1+pen*2)/3;%土豆三塊錢一斤potato_actual=[1.6 2.6 5.6 1.6 2.6 3.6 4.6 3.6 8.0 2.0];%土豆的準確重量[input,ps1]=mapminmax([banana;pen]);%兩行十列[target,ps2]=mapminmax([potato_actual]); %一行十列%這裡的ps1,2是這個歸一化操作的種子,之後我們要用這個進行逆操作net=newff(input,target,6,{"tansig","purelin"},"trainlm");net.trainParam.epochs=1000; %最大訓練次數net.trainParam.goal=0.00001;%目標最小誤差LP.lr=0.000001;%學習速率net=train(net,input,target);banana1=[2 1 3 5 9 9]; %假設香蕉1塊錢一斤pen1=[1 2 8 2 10 3];%筆兩塊錢一斤potato_actual1=(banana1*1+pen1*2)/3;%土豆三塊錢一斤input1=mapminmax("apply",[banana1;pen1],ps1);%應用之前的種子歸一化%預測output1=net(input1);prediction1=mapminmax("reverse",output1,ps2);%讓我們做出預測值與實際值的圖像set(0,"defaultfigurecolor","w")figureplot(potato_actual1,"*","color",[222 87 18]/255);hold onplot(prediction1,"-o","color",[244 208 0]/255,..."linewidth",2,"MarkerSize",14,"MarkerEdgecolor",[138 151 123]/255);legend("actua value","prediction1"),title("預測其他數據")xlabel("potato1"),ylabel("weight")%使得坐標圖優美 set(gca, "Box", "off", "TickDir", "out", "TickLength", [.02 .02], ... "XMinorTick", "on", "YMinorTick", "on", "YGrid", "on", ... "XColor", [.3 .3 .3], "YColor", [.3 .3 .3],"LineWidth", 1)%如果是預測本身呢?figureoutput=net(input);prediction=mapminmax("reverse",output,ps2);%讓我們做出預測值與實際值的圖像plot(potato_actual,"*","color",[29 131 8]/255);hold onplot(prediction,"-o","color",[244 208 0]/255,..."linewidth",2,"MarkerSize",14,"MarkerEdgecolor",[138 151 123]/255);legend("actua value","prediction")title("預測本身10個數據")%使得坐標圖優美xlabel("potato"),ylabel("weight") set(gca, "Box", "off", "TickDir", "out", "TickLength", [.02 .02], ... "XMinorTick", "on", "YMinorTick", "on", "YGrid", "on", ... "XColor", [.3 .3 .3], "YColor", [.3 .3 .3],"LineWidth", 1)

推薦網站:

封面就時從這個網站截圖下來的,要翻牆,下個加速器就行


推薦閱讀:

淺談神經網路與數學之間的關係
神經網路中利用矩陣進行反向傳播運算的實質
用人工神經網路求解微分方程
邏輯與神經之間的橋
9行Python代碼搭建神經網路

TAG:神经网络 | MATLAB |