【优化预测】基于matlab天牛须算法优化BP神经网络预测【含Matlab源码 1318期】
一、天牛須搜索算法簡介
1 天牛須搜索算法定義
天牛須搜索(Beetle Antennae Search-BAS),也叫甲殼蟲須搜索,是2017年提出的一種高效的智能優化算法。類似于遺傳算法、粒子群算法、模擬退火等智能優化算法,天牛須搜索不需要知道函數的具體形式,不要虛梯度信息,就可以實現高效尋優。相比于粒子群算法,天牛須搜索只只要一個個體,即一個天牛,運算量大大降低。
2 原理及代碼實現
2.1 仿生原理
天牛須搜索時受到天牛覓食原理啟發而開發的算法。
生物原理:當天牛覓食時,天牛并不知道食物在哪,而是根據食物氣味的強弱來覓食。天牛有倆只長觸角,如果左邊觸角收到的氣味強度比右邊大,那下一步天牛就往左飛,否則就往右飛。根據這一簡單原理天牛就可以有效找到食物。
天牛須搜索得來的啟發:食物的氣味就相當于一個函數,這個函數在三維空間每個點值都不同,天牛兩個須可以采集自身附近兩點的氣味值,天牛的目的是找到全局氣味值最大的點。仿照天牛的行為,我們就可以高效的進行函數尋優。
2.2 算法
天牛在三維空間運動,而天牛須搜索需要對任意維函數都有效才可以。因而,天牛須搜索是對天牛生物行為在任意維空間的推廣。采用如下的簡化模型假設描述天牛:
天牛左右兩須位于質心兩邊。
天牛步長step與兩須之間距離d0的比是個固定常數,即step=c*d0,其中c是常數。即,大天牛(兩須距離長)走大步,小天牛走小步。
天牛飛到下一步后,頭的朝向是隨機的。
2.3 建模:(n維空間函數f最小化)
第一步:對一個n維空間的優化問題,我們用xl表示左須坐標,xr表示右須坐標,x表示質心坐標,用d0表示兩須之間的距離。根據假設3,天牛頭朝向任意,因而從天牛右須指向左須的向量的朝向也是任意的,所以可以產生一個隨機向量dir=rands(n,1)來表示它。對此歸一化:dir=dir/norm(dir);我們這樣可以得到xl-xr=d0dir;顯然,xl,xr還可以表示成質心的表達式;xl=x+d0dir/2;xr=x-d0dir/2。
第二步:對于待優化函數f,求取左右兩須的值:felft=f(xl);fright=f(xr);判斷兩個值大小,如果fleft<fright,為了探尋f的最小值,則天牛向著左須方向行進距離step,即x=x+stepnormal(xl-xr);如果fleft>fright,為了探尋f的最小值,則天牛向著右須方向行進距離step,即x=x-stepnormal(xl-xr);如以上兩種情況可以采用符號函數sign統一寫成:x=x-stepnormal(xl-xr)sign(fleft-fright)=x-stepdir*sign(fleft-fright)。
(注:其中normal是歸一化函數)
循環迭代:
dir=rands(n,1);dir=dir/norm(dir);%須的方向
xl=x+d0dir/2;xr=x-d0dir/2;%須的坐標
felft=f(xl);fright=f(xr);%須的氣味強度
x=x-stepdirsign(fleft-fright)。%下一步位置
關于步長:
兩種推薦:
每步迭代中采用step=etastep,其中eta在0,1之間靠近1,通常可取eta=0.95;
引入新變量temp和最終分辨率step0,temp=etatemp,step=temp+step0.
關于初始步長:初始步長可以盡可能大,最好與自變量最大長度相當。
二、BP神經網絡簡介
1 BP神經網絡概述
BP(Back Propagation)神經網絡是1986年由Rumelhart和McCelland為首的科研小組提出,參見他們發表在Nature上的論文 Learning representations by back-propagating errors 。
BP神經網絡是一種按誤差逆傳播算法訓練的多層前饋網絡,是目前應用最廣泛的神經網絡模型之一。BP網絡能學習和存貯大量的 輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數學方程。它的學習規則是使用最速下降法,通過反向傳播來不斷 調整網絡的權值和閾值,使網絡的誤差平方和最小。
2 BP算法的基本思想
上一次我們說到,多層感知器在如何獲取隱層的權值的問題上遇到了瓶頸。既然我們無法直接得到隱層的權值,能否先通過輸出層得到輸出結果和期望輸出的誤差來間接調整隱層的權值呢?BP算法就是采用這樣的思想設計出來的算法,它的基本思想是,學習過程由信號的正向傳播與誤差的反向傳播兩個過程組成。
正向傳播時,輸入樣本從輸入層傳入,經各隱層逐層處理后,傳向輸出層。若輸出層的實際輸出與期望的輸出(教師信號)不符,則轉入誤差的反向傳播階段。
反向傳播時,將輸出以某種形式通過隱層向輸入層逐層反傳,并將誤差分攤給各層的所有單元,從而獲得各層單元的誤差信號,此誤差信號即作為修正各單元權值的依據。這兩個過程的具體流程會在后文介紹。
BP算法的信號流向圖如下圖所示
3 BP網絡特性分析——BP三要素
我們分析一個ANN時,通常都是從它的三要素入手,即
1)網絡拓撲結構;
2)傳遞函數;
3)學習算法。
每一個要素的特性加起來就決定了這個ANN的功能特性。所以,我們也從這三要素入手對BP網絡的研究。
3.1 BP網絡的拓撲結構
上一次已經說了,BP網絡實際上就是多層感知器,因此它的拓撲結構和多層感知器的拓撲結構相同。由于單隱層(三層)感知器已經能夠解決簡單的非線性問題,因此應用最為普遍。三層感知器的拓撲結構如下圖所示。
一個最簡單的三層BP:
3.2 BP網絡的傳遞函數
BP網絡采用的傳遞函數是非線性變換函數——Sigmoid函數(又稱S函數)。其特點是函數本身及其導數都是連續的,因而在處理上十分方便。為什么要選擇這個函數,等下在介紹BP網絡的學習算法的時候會進行進一步的介紹。
單極性S型函數曲線如下圖所示。
雙極性S型函數曲線如下圖所示。
3.3 BP網絡的學習算法
BP網絡的學習算法就是BP算法,又叫 δ 算法(在ANN的學習過程中我們會發現不少具有多個名稱的術語), 以三層感知器為例,當網絡輸出與期望輸出不等時,存在輸出誤差 E ,定義如下
下面我們會介紹BP網絡的學習訓練的具體過程。
4 BP網絡的訓練分解
訓練一個BP神經網絡,實際上就是調整網絡的權重和偏置這兩個參數,BP神經網絡的訓練過程分兩部分:
前向傳輸,逐層波浪式的傳遞輸出值;
逆向反饋,反向逐層調整權重和偏置;
我們先來看前向傳輸。
前向傳輸(Feed-Forward前向反饋)
在訓練網絡之前,我們需要隨機初始化權重和偏置,對每一個權重取[ ? 1 , 1 ] [-1,1][?1,1]的一個隨機實數,每一個偏置取[ 0 , 1 ] [0,1][0,1]的一個隨機實數,之后就開始進行前向傳輸。
神經網絡的訓練是由多趟迭代完成的,每一趟迭代都使用訓練集的所有記錄,而每一次訓練網絡只使用一條記錄,抽象的描述如下:
while 終止條件未滿足:for record:dataset:trainModel(record)
4.1 逆向反饋(Backpropagation)
4.2 訓練終止條件
每一輪訓練都使用數據集的所有記錄,但什么時候停止,停止條件有下面兩種:
設置最大迭代次數,比如使用數據集迭代100次后停止訓練
計算訓練集在網絡上的預測準確率,達到一定門限值后停止訓練
5 BP網絡運行的具體流程
5.1 網絡結構
輸入層有n nn個神經元,隱含層有p pp個神經元,輸出層有q qq個神經元。
5.2 變量定義
第九步:判斷模型合理性
判斷網絡誤差是否滿足要求。
當誤差達到預設精度或者學習次數大于設計的最大次數,則結束算法。
否則,選取下一個學習樣本以及對應的輸出期望,返回第三部,進入下一輪學習。
6 BP網絡的設計
在進行BP網絡的設計是,一般應從網絡的層數、每層中的神經元個數和激活函數、初始值以及學習速率等幾個方面來進行考慮,下面是一些選取的原則。
6.1 網絡的層數
理論已經證明,具有偏差和至少一個S型隱層加上一個線性輸出層的網絡,能夠逼近任何有理函數,增加層數可以進一步降低誤差,提高精度,但同時也是網絡 復雜化。另外不能用僅具有非線性激活函數的單層網絡來解決問題,因為能用單層網絡解決的問題,用自適應線性網絡也一定能解決,而且自適應線性網絡的 運算速度更快,而對于只能用非線性函數解決的問題,單層精度又不夠高,也只有增加層數才能達到期望的結果。
6.2 隱層神經元的個數
網絡訓練精度的提高,可以通過采用一個隱含層,而增加其神經元個數的方法來獲得,這在結構實現上要比增加網絡層數簡單得多。一般而言,我們用精度和 訓練網絡的時間來恒量一個神經網絡設計的好壞:
(1)神經元數太少時,網絡不能很好的學習,訓練迭代的次數也比較多,訓練精度也不高。
(2)神經元數太多時,網絡的功能越強大,精確度也更高,訓練迭代的次數也大,可能會出現過擬合(over fitting)現象。
由此,我們得到神經網絡隱層神經元個數的選取原則是:在能夠解決問題的前提下,再加上一兩個神經元,以加快誤差下降速度即可。
6.3 初始權值的選取
一般初始權值是取值在(?1,1)之間的隨機數。另外威得羅等人在分析了兩層網絡是如何對一個函數進行訓練后,提出選擇初始權值量級為s√r的策略, 其中r為輸入個數,s為第一層神經元個數。
6.4 學習速率
學習速率一般選取為0.01?0.8,大的學習速率可能導致系統的不穩定,但小的學習速率導致收斂太慢,需要較長的訓練時間。對于較復雜的網絡, 在誤差曲面的不同位置可能需要不同的學習速率,為了減少尋找學習速率的訓練次數及時間,比較合適的方法是采用變化的自適應學習速率,使網絡在 不同的階段設置不同大小的學習速率。
6.5 期望誤差的選取
在設計網絡的過程中,期望誤差值也應當通過對比訓練后確定一個合適的值,這個合適的值是相對于所需要的隱層節點數來確定的。一般情況下,可以同時對兩個不同 的期望誤差值的網絡進行訓練,最后通過綜合因素來確定其中一個網絡。
7 BP網絡的局限性
BP網絡具有以下的幾個問題:
(1)需要較長的訓練時間:這主要是由于學習速率太小所造成的,可采用變化的或自適應的學習速率來加以改進。
(2)完全不能訓練:這主要表現在網絡的麻痹上,通常為了避免這種情況的產生,一是選取較小的初始權值,而是采用較小的學習速率。
(3)局部最小值:這里采用的梯度下降法可能收斂到局部最小值,采用多層網絡或較多的神經元,有可能得到更好的結果。
8 BP網絡的改進
P算法改進的主要目標是加快訓練速度,避免陷入局部極小值等,常見的改進方法有帶動量因子算法、自適應學習速率、變化的學習速率以及作用函數后縮法等。 動量因子法的基本思想是在反向傳播的基礎上,在每一個權值的變化上加上一項正比于前次權值變化的值,并根據反向傳播法來產生新的權值變化。而自適應學習 速率的方法則是針對一些特定的問題的。改變學習速率的方法的原則是,若連續幾次迭代中,若目標函數對某個權倒數的符號相同,則這個權的學習速率增加, 反之若符號相反則減小它的學習速率。而作用函數后縮法則是將作用函數進行平移,即加上一個常數。
三、部分源代碼
%% 用天牛須算法來優化BP的權值和閾值,數據樣本為測試數據,非論文實際數據,樣本60個,其中每個樣本具有401個特征值;NIR為樣本的光譜數據,octane為60*1的辛烷值數據
% 1.0版本
%% 清空環境變量
clear all
close all
clc
tic
%% 加載數據
load spectra_data.mat
% 隨機產生訓練集和測試集
temp=randperm(size(NIR,1));
%訓練集——50個樣本
P=NIR(temp(1:50),:)';
T=octane(temp(1:50),:)';
%測試集——10個樣本
P_test=NIR(temp(51:end),:)';
T_test=octane(temp(51:end),:)';
N=size(P_test,2);
M=size(P,2);%% 歸一化
[P, ps_input] = mapminmax(P,0,1);%p_train歸一化處理,范圍為[0,1],默認情況下為[-1,1]
P_test = mapminmax('apply',P_test,ps_input);%對P_test采用相同的映射
[T, ps_output] = mapminmax(T,0,1);
%%
inputnum=size(P,1);
outputnum=size(T,1);
hiddennum=9;%初始隱含層神經元個數
%% 創建網絡
net=newff(P,T,hiddennum);
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
%% 天牛須算法初始化
eta=0.8;
c=5;%步長與初始距離之間的關系
step=30;%初始步長
n=100;%迭代次數
k=inputnum*hiddennum+outputnum*hiddennum+hiddennum+outputnum;
x=rands(k,1);
bestX=x;
bestY=fitness(bestX,inputnum,hiddennum,outputnum,net,P,T);
fbest_store=bestY;
x_store=[0;x;bestY];
display(['0:','xbest=[',num2str(bestX'),'],fbest=',num2str(bestY)])
%% 迭代部分
for i=1:n
d0=step/c;dir=rands(k,1);dir=dir/(eps+norm(dir));xleft=x+dir*d0/2;fleft=fitness(xleft,inputnum,hiddennum,outputnum,net,P,T);xright=x-dir*d0/2;fright=fitness(xright,inputnum,hiddennum,outputnum,net,P,T);x=x-step*dir*sign(fleft-fright);y=fitness(x,inputnum,hiddennum,outputnum,net,P,T);if y<bestYbestX=x;bestY=y;endif y<0.001bestX=x;bestY=y;endx_store=cat(2,x_store,[i;x;y]);fbest_store=[fbest_store;bestY];step=step*eta;display([num2str(i),':xbest=[',num2str(bestX'),'],fbest=',num2str(bestY)])
end
M=size(P,2);
w1= bestX(1:inputnum*hiddennum);
B1= bestX(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2= bestX(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2= bestX(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
%% 網絡權值賦值
%% 使用優化后的權值和閾值測試結果
%% 使用優化后的權值和閾值
inputnum=size(P,1);%輸入層神經元個數
outputnum=size(T,1);%輸出層神經元個數
N=size(P_test,2);
M=size(P,2);
%% 新建BP
net=newff(P,T,9);
%% 設置網絡參數:訓練次數1000,訓練目標0.001,學習速率00.1
net.trainParam.epochs =3000;
net.trainParam.goal = 1e-6;
net.trainParam.lr = 0.01;
%% BP初始權值和閾值
w1num=inputnum*hiddennum;%輸入層到隱含層的權值個數
w2num=outputnum*hiddennum;%隱含層到輸入層的權值個數
w1=bestX(1:w1num);%初始輸入層到隱含層的權值
B1=bestX(w1num+1:w1num+hiddennum);
w2=bestX(w1num+hiddennum+1:w1num+hiddennum+w2num);%初始隱含層到輸出層的權值
B2=bestX(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum);%輸出層閾值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%% 訓練網絡
net=train(net,P,T);
%% 測試網絡
t_sim_P= sim(net,P);
t_sim_P_test= sim(net,P_test);
%% 反歸一化
T=mapminmax('reverse',T,ps_output);
function error = fitness(x,inputnum,hiddennum,outputnum,net,P,T)
%該函數用來計算適應度值
%% 輸入
%x 個體
%inputnum 輸入層節點數
%hiddennum 隱含層節點數
%outputnum 輸出層節點數
%net 網絡
%P 訓練輸入數據
%T 訓練輸出數據
%% 輸出
%error 個體適應度值
%% 提取
M=size(P,2);
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
%% 網絡權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%% 訓練網絡
net=train(net,P,T);
%% 測試
Y=sim(net,P);
error=sum(abs(Y-T).^2)./M;
end
四、運行結果
五、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1] 包子陽,余繼周,楊杉.智能優化算法及其MATLAB實例(第2版)[M].電子工業出版社,2016.
[2]張巖,吳水根.MATLAB優化算法源代碼[M].清華大學出版社,2017.
總結
以上是生活随笔為你收集整理的【优化预测】基于matlab天牛须算法优化BP神经网络预测【含Matlab源码 1318期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 再有人问你volatile是什么,把这篇
- 下一篇: 蓝鸥Unity开发基础——Switch语