加載數據——輸入樣本數據個數、訓練數據個數、預測數據個數、中間層隱藏節點個數、網絡輸入維度、網絡輸出維度,x軸坐標名稱、y軸坐標名稱——點擊開始計算即可出現結果,同時會在當前文件夾下生成預測數據的excel文件和兩個圖片1.png、2.png。需要完整GUI程序,可以進行打賞後截圖(40元及以上),點擊公眾號「聯繫掌門」進行聯繫,或者在公眾號內回復截圖,幾小時內會回復。界面編程不易,還請見諒!
BP神經網絡的計算過程由正向計算過程和反向計算過程組成。正向傳播過程,輸入模式從輸入層經隱單元層逐層處理,並轉向輸出層,每~層神經元的狀態只影響下一層神經元的狀態。如果在輸出層不能得到期望的輸出,則轉入反向傳播,將誤差信號沿原來的連接通路返回,通過修改各神經元的權值,使得誤差信號最小。
雙極S形函數與S形函數主要區別在於函數的值域,雙極S形函數值域是(-1,1),而S形函數值域是(0,1)。
由於S形函數與雙極S形函數都是可導的(導函數是連續函數),因此適合用在BP神經網絡中。(BP算法要求激活函數可導)
神經網絡實現步驟
1. 數據預處理
在訓練神經網絡前一般需要對數據進行預處理,一種重要的預處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。
(1) 什麼是歸一化?
數據歸一化,就是將數據映射到[0,1]或[-1,1]區間或更小的區間,比如(0.1,0.9) 。
(2) 為什麼要歸一化處理?
<1>輸入數據的單位不一樣,有些數據的範圍可能特別大,導致的結果是神經網絡收斂慢、訓練時間長。
<2>數據範圍大的輸入在模式分類中的作用可能會偏大,而數據範圍小的輸入作用就可能會偏小。
<3>由於神經網絡輸出層的激活函數的值域是有限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域。例如神經網絡的輸出層若採用S形激活函數,由於S形函數的值域限制在(0,1),也就是說神經網絡的輸出只能限制在(0,1),所以訓練數據的輸出就要歸一化到[0,1]區間。
<4>S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X)在參數a=1時,f(100)與f(5)只相差0.0067。
(3) 歸一化算法
一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:
<1>
y = ( x - min )/( max - min )
其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化後的輸出向量為y 。上式將數據歸一化到 [ 0 , 1 ]區間,當激活函數採用S形函數時(值域為(0,1))時這條式子適用。
<2>
y = 2 * ( x - min ) / ( max - min ) - 1
這條公式將數據歸一化到 [ -1 , 1 ] 區間。當激活函數採用雙極S形函數(值域為(-1,1))時這條式子適用。
(4) Matlab數據歸一化處理函數
Matlab中歸一化處理數據可以採用premnmx , postmnmx , tramnmx 這3個函數。
<1> premnmx
語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
參數:
pn:p矩陣按行歸一化後的矩陣
minp,maxp:p矩陣每一行的最小值,最大值
tn:t矩陣按行歸一化後的矩陣
mint,maxt:t矩陣每一行的最小值,最大值
作用:將矩陣p,t歸一化到[-1,1] ,主要用於歸一化處理訓練數據集。
<2> tramnmx
語法:[pn] = tramnmx(p,minp,maxp)
參數:
minp,maxp:premnmx函數計算的矩陣的最小,最大值
pn:歸一化後的矩陣
作用:主要用於歸一化處理待分類的輸入數據。
<3> postmnmx
語法:[p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)
參數:
minp,maxp:premnmx函數計算的p矩陣每行的最小值,最大值
mint,maxt:premnmx函數計算的t矩陣每行的最小值,最大值
作用:將矩陣pn,tn映射回歸一化處理前的範圍。postmnmx函數主要用於將神經網絡的輸出結果映射回歸一化前的數據範圍。
2. 使用Matlab實現神經網絡
使用Matlab建立前饋神經網絡主要會使用到下面3個函數:
newff :前饋網絡創建函數
train:訓練一個神經網絡
sim :使用網絡進行仿真
下面簡要介紹這3個函數的用法。
(1) newff函數
<1>newff函數語法
newff函數參數列表有很多的可選參數,具體可以參考Matlab的幫助文檔,這裡介紹newff函數的一種簡單的形式。
語法:net = newff ( A, B, {C} ,『trainFun』)
參數:
A:一個n×2的矩陣,第i行元素為輸入信號xi的最小值和最大值;
B:一個k維行向量,其元素為網絡中各層節點數;
C:一個k維字符串行向量,每一分量為對應層神經元的激活函數;
trainFun :為學習規則採用的訓練算法。
<2>常用的激活函數
常用的激活函數有:
a) 線性函數 (Linear transfer function)
f(x) = x
該函數的字符串為』purelin』。
b) 對數S形轉移函數( Logarithmic sigmoid transfer function )
該函數的字符串為』logsig』。
c) 雙曲正切S形函數 (Hyperbolic tangent sigmoid transfer function )
也就是上面所提到的雙極S形函數。
該函數的字符串為』 tansig』。
Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有激活函數的定義說明。
<3>常見的訓練函數
常見的訓練函數有:
traingd :梯度下降BP訓練函數(Gradient descent backpropagation)
traingdx :梯度下降自適應學習率訓練函數
<4>網絡配置參數
一些重要的網絡配置參數如下:
net.trainparam.goal :神經網絡訓練的目標誤差
net.trainparam.show :顯示中間結果的周期
net.trainparam.epochs :最大迭代次數
net.trainParam.lr :學習率
(2) train函數
網絡訓練學習函數。
語法:[ net, tr, Y1, E ] = train( net, X, Y )
參數:
X:網絡實際輸入
Y:網絡應有輸出
tr:訓練跟蹤信息
Y1:網絡實際輸出
E:誤差矩陣
(3) sim函數
語法:Y=sim(net,X)
參數:
net:網絡
X:輸入給網絡的K×N矩陣,其中K為網絡輸入個數,N為數據樣本數
Y:輸出矩陣Q×N,其中Q為網絡輸出個數
function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global datatry delete(allchild(handles.axes1)); delete(allchild(handles.axes2));endset(handles.text14,'string','正在訓練中');set(handles.uitable1,'data',data);warning off;samnum = str2num(get(handles.edit6,'string'));testsamnum =str2num(get(handles.edit7,'string'));forcastsamnum = str2num(get(handles.edit8,'string'));hiddenunitnum =str2num(get(handles.edit9,'string'));indim = str2num(get(handles.edit10,'string'));outdim =str2num(get(handles.edit11,'string'));str1 = get(handles.edit12,'string');str2 = get(handles.edit13,'string');hj=data;X=hj(1:samnum,outdim+1:end-1)';D=hj(1:samnum,outdim)';test=D;p = X;t = D;[samin,minp,maxp,tn,mint,maxt] = premnmx(p,t);rand('state',sum(100*clock))noisevar = 0.01;noise = noisevar*randn(1,samnum);samout = tn + noise;testsamin = samin;testsamout = samout;maxepochs = 50000;lr = 0.035;e0 = 0.65*10^(-3);w1 = 0.5*rand(hiddenunitnum,indim)-0.1;b1 = 0.5*rand(hiddenunitnum,1)-0.1;w2 = 0.5*rand(outdim,hiddenunitnum)-0.1;b2 = 0.5*rand(outdim,1)-0.1;errhistory = [];for i = 1:maxepochs hiddenout = logsig(w1*samin+repmat(b1,1,samnum)); networkout = w2*hiddenout+repmat(b2,1,samnum); error = samout-networkout; sse = sumsqr(error); errhistory = [errhistory sse]; if sse<e0 break; end delta2 = error; delta1 = w2'*delta2.*hiddenout.*(1-hiddenout); dw2 = delta2*hiddenout'; db2 = delta2*ones(samnum,1); dw1 = delta1*samin'; db1 = delta1*ones(samnum,1); w2 = w2+lr*dw2; b2 = b2+lr*db2; w1 = w1+lr*dw1; b1 = b1+lr*db1;end