1. 程式人生 > 其它 >【優化預測】基於matlab GA優化BP迴歸預測(含優化前的對比)【含Matlab原始碼 W001期】

【優化預測】基於matlab GA優化BP迴歸預測(含優化前的對比)【含Matlab原始碼 W001期】

一、簡介

1 BP神經網路預測原理簡介
BP 神經網路是一種多層前饋神經網路,常用的為輸入層-單隱含層-輸出層的三層結構,如下圖所示。

BP神經網路訓練的主要思想:輸入的訊號特徵資料先對映到隱含層(啟用函式實現),再對映到輸出層(預設採用線性傳遞函式),得到期望輸出值。將期望輸出值和實際測量值做比較,計算誤差函式J,再將誤差反向傳播,通過梯度下降等演算法來調節BP網路的權值和閾值。重複該過程,直到滿足設定的目標誤差或者最大迭代次數等終止準則,停止訓練。

通過下面的例子來理解每一層的作用。

1)輸入層:相當於人的五官,五官獲取外部資訊,對應神經網路模型input埠接收輸入資料的過程。
2)隱含層:對應人的大腦,大腦對五官傳遞來的資料進行分析和思考,神經網路的隱含層hidden Layer對輸入層傳來的資料x進行對映,簡單理解為一個公式hiddenLayer_output=F(w*x+b)。其中,w、b叫做權重、閾值引數,F()為對映規則,也叫啟用函式,hiddenLayer_output是隱含層對於傳來的資料對映的輸出值。換句話說,隱含層對於輸入的影響因素資料x進行了對映,產生了對映值。
3)輸出層:可以對應為人的四肢,大腦對五官傳來的資訊經過思考(隱含層對映)之後,再控制四肢執行動作(向外部作出響應)。類似地,BP神經網路的輸出層對hiddenLayer_output再次進行對映,outputLayer_output=w *hiddenLayer_output+b。其中,w、b為權重、閾值引數,outputLayer_output是神經網路輸出層的輸出值(也叫模擬值、預測值)(理解為,人腦對外的執行動作,比如嬰兒拍打桌子)。
4)梯度下降演算法:通過計算outputLayer_output和神經網路模型傳入的y值之間的偏差,使用演算法來相應調整權重和閾值等引數。這個過程,可以理解為嬰兒拍打桌子,打偏了,根據偏離的距離遠近,來調整身體使得再次揮動的胳膊不斷靠近桌子,最終打中。

BP神經網路所實現的功能作用

“能盡數天星,便能盡知棋勢”。圍棋體現著大自然的道法,而在AlphaGo擊敗人類圍棋冠軍,則是使用演算法來尋求圍棋的道,實現人機對戰。BP神經網路訓練的結果:得到多維資料x與y之間存在的規律,即實現由x來對映逼近y。而BP訓練出來得到的模型是否可靠,表現為對其他未經過訓練的資料,輸入到BP中,是否能輸出較為準確的預測值。對此,在BP神經網路訓練之後,還需要再給指標因素x1到訓練好的bp network中,得到相應的BP輸出值(預測值)predict1,通過作圖等,計算Mse,Mape,R方等指標,來對比predict1和y1的接近程度,就可以知道模型是否預測準確。這是BP模型的測試過程,即預測過程。

小結 BP神經網路實現了:a). 根據訓練集資料,訓練得到一個模型,b). 對模型的可靠性與準確性進行測試集(不同於訓練樣本資料)預測,和實際值對比,檢驗預測的精度。c). 只給輸入,得到預測值(可理解為測試集的資料丟了實測值,本質一樣,給輸入到BP中,得到輸出)。由於該情況無輸出,純預測,無法檢驗精度是否合格,寫論文時無太大意義而不必實現該情況的步驟。

2 遺傳演算法GA優化BP神經網路原理

在BP神經網路訓練的過程中,通過前向傳播資料與誤差反向傳遞,使用演算法來更新權重閾值。一方面,在該過程中,第一次前向傳播過程的權重和閾值該如何確定,即如何初始化權重和閾值。深度學習的方法是採用隨機化方法得到初始的權值與閾值引數。另一方面,選定了初始引數後,梯度下降演算法將初始引數值作為起點,進行引數優化與更新。

在優化演算法的發展中,有兩類:確定性演算法與啟發式演算法。確定性演算法指使用數學方法求最優問題,找到的結果與求導的初始點有關,一般為確定值。啟發式演算法則是靈感源於自然界生物進化的規律,主要思想為迭代逼近最優,優化的結果為滿足工程精度要求的可變值(無限接近理論最優值)。

在上述過程中,作為一種確定性演算法,梯度下降演算法的收斂性是得到了證明的,但收斂值並非一定是全域性最優,與初始的引數值(梯度下降演算法的起點)有關。由於隨機初始的引數未必是最優的起點(指既訓練準確,又預測可靠),因此訓練的模型可靠性和穩定性受到了初始隨機引數的很大影響。作為啟發式演算法,遺傳演算法GA具體很好的全域性搜尋能力,引入GA用來解決此問題。

主要思想 將引數作為問題的決策變數,模型的精度作為問題的目標函式。遺傳演算法GA優化BP神經網路的演算法流程圖如下:

3 GA-BP模型建立
3.1 模型與資料介紹
下面以MATLAB官方提供的化學感測器的資料集為例,進行建模。
資料介紹:採集某個化學實驗過程的資料,將8個感測器的取樣資料作為輸入(x),第9個感測器的取樣資料作為輸出(y)。
資料格式如下:

讀取資料:

%% 讀取讀取
data=xlsread('資料.xlsx','Sheet1','A1:I498'); %%使用xlsread函式讀取EXCEL中對應範圍的資料即可  

%輸入輸出資料
input=data(:,1:end-1);    %data的第一列-倒數第二列為特徵指標
output=data(:,end);  %data的最後面一列為輸出的指標值

N=length(output);   %全部樣本數目
testNum=100;   %設定測試樣本數目
trainNum=N-testNum;    %計算訓練樣本數目

3.2 GA與BP引數設定
1) BP引數設定

對權重和閾值有關的引數進行說明:
a). 輸入層和輸出層節點使用size函式直接獲取。函式用法:[M,N]=size(A),M為A的行數,N為A的列數。size(A,2)得到的是第二個引數N,即列數。此資料中,輸入8個維度指標,輸出的為1個維度指標。即輸入層節點為8,輸出層節點為1。

inputnum=size(input,2);   %輸入層神經元節點個數
outputnum=size(output,2);  %輸出層神經元節點個數

b). 隱含層節點的確定過程,使用迴圈來遍歷範圍內的隱含層節點與訓練誤差情況。因為要找最小的誤差,所以初始化訓練誤差時,將MSE設定較大的數字,用於在迴圈中確定最佳的隱含層節點。

%確定隱含層節點個數
%採用經驗公式hiddennum=sqrt(m+n)+a,m為輸入層節點個數,n為輸出層節點個數,a一般取為1-10之間的整數
MSE=1e+5; %初始化最小誤差
for hiddennum=fix(sqrt(inputnum+outputnum))+1:fix(sqrt(inputnum+outputnum))+10

c). 其他BP引數,學習速率,訓練次數,訓練的目標誤差等

% 網路引數
    net.trainParam.epochs=1000;         % 訓練次數
    net.trainParam.lr=0.01;             % 學習速率
    net.trainParam.goal=0.000001;       % 訓練目標最小誤差

2)遺傳演算法GA引數設定

%初始化ga引數
PopulationSize_Data=30;   %初始種群規模
MaxGenerations_Data=50;   %最大進化代數
CrossoverFraction_Data=0.8;  %交叉概率
MigrationFraction_Data=0.2;   %變異概率

3.3 遺傳演算法優化BP的設計
1)優化變數的設計
使用遺傳演算法求解優化問題時,對於決策變數(優化變數)有三種編碼方式:二進位制編碼,向量形式編碼,矩陣形式編碼。

由於權重和閾值分別以m×n維的矩陣,向量形式存在與BP神經網路結構(net)中。為方便對每個元素都進行優化,先將元素分別取出,然後按取的順序放入到向量(染色體)中,完成編碼。權重和閾值的經驗範圍為[-1,1],可適當將尋優的範圍放寬,取[-3,3]。
優化變數(元素)個數的計算如下:

nvars=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;    %變數維度
lb=repmat(-3,nvars,1);    %自變數下限 %repmat得到一個nvars×1維的向量,每個元素的值都為-3,即優化變數下限
ub=repmat(3,nvars,1);   %自變數上限

2)適應度函式的設計
採用以下公式計算適應度值。

式中,TraingingSet,TestingSet,分別為訓練集和測試集的樣本。因為預測精度越高,說明誤差越低,所以公式設計為求解最小的均方誤差。使用遺傳演算法後,適應度函式值越小,表明訓練越準確,且兼顧模型的預測精度更好。
3)演算法設計
將遺傳演算法視為一個“黑箱”優化器。在確定了優化的變數與目標適應度函式後,只需要經過該“黑箱”,即可輸出最小的誤差(精度最好值)和最優解變數,再把變數賦給BP神經網路的權值矩陣與閾值向量的相應位置,進行優化後的BP訓練與測試即可。說明:在遺傳演算法的“黑箱”求解器中進行的演算法操作為:選擇、交叉與變異。

二、原始碼

**程式碼附件說明:**
a) .mian.m為主程式,含BP預測與GA優化BP預測兩個部分的實現。在程式外部資料EXCEL中換自己資料集,MATLAB程式中設定相應的資料範圍即可執行得到結果。程式碼使用中文註釋清楚。
b). 資料集為EXCEL格式的資料,換資料時,在MATLAB程式中設定相應的EXCEL資料讀取範圍即可。
c). 採用經驗公式使用迴圈來確定隱含層節點數目,對輸入層、隱含層和輸出層的神經元節點數都提供了過程。

**程式碼使用步驟:**
資料介紹:程式碼採用深度學習中常用的化學感測器的資料集樣本進行實現。資料格式為EXCEL。直接套資料執行。輸入的影響指標個數不限,單輸出。
a). 在程式外部資料EXCEL檔案中換上自己資料集;

b). 雙擊點開main.m主程式檔案,讀取EXCEL的方式如下:
```c
% 讀取讀取
data=xlsread('資料.xlsx','Sheet1','A1:I498'); %%使用xlsread函式讀取EXCEL中對應範圍的資料即可  

%輸入輸出資料
input=data(:,1:end-1);    %data的第一列-倒數第二列為特徵指標
output=data(:,end);  %data的最後面一列為輸出的指標值

三、執行結果






四、備註

版本:2014a

完整程式碼或代寫加QQ1564658423