【預(yù)測模型】基于狼群算法優(yōu)化BP神經(jīng)網(wǎng)絡(luò)實現(xiàn)預(yù)測matlab源碼
一、簡介
狼群算法
1 狼群算法中的狼種類分為以下幾種:
頭狼、探狼、猛狼。
2 獵物分配規(guī)則:論功行賞,先強后弱。
3 狼群算法的主體構(gòu)成:探狼游走、頭狼召喚、猛狼圍攻3種智能行為,“勝者為王”的頭狼角逐規(guī)則和“優(yōu)勝劣汰”的狼群更新規(guī)則。
Step1:在解空間中隨機初始化狼群的空間坐標,依據(jù)目標函數(shù)值的大小角逐出人工頭狼。
Step2:探狼開始隨機游走搜索獵物,若發(fā)現(xiàn)某個位置的目標函數(shù)值大于頭狼的目標函數(shù)值,將更新頭狼位置,同時頭狼發(fā)出召喚行為;若未發(fā)現(xiàn),探狼繼續(xù)游走直到達到最大游走次數(shù),頭狼在原本的位置發(fā)出召喚行為。
Step3:聽到頭狼召喚的猛狼以較大的步長快速向頭狼奔襲,若奔襲途中猛狼的目標函數(shù)值大于頭狼的目標函數(shù)值,則將對頭狼位置進行更新;否則,猛狼將繼續(xù)奔襲直到進入圍攻范圍。
Step4:靠近頭狼的猛狼將聯(lián)合探狼對獵物(把頭狼位置視為獵物)進行圍捕,圍捕過程中若其他人工狼的目標函數(shù)值大于頭狼的目標函數(shù)值,則對頭狼位置進行更新,直到捕獲獵物。
Step5:淘汰狼群中目標函數(shù)值較小的人工狼,并在解空間中隨機生成新的人工狼,實現(xiàn)狼群的更新。
Step6:最后判斷頭狼的目標函數(shù)值是否達到精度要求或算法是否達到最大迭代次數(shù)。
4 人工狼群算法的若干規(guī)則:
4.1 頭狼產(chǎn)生規(guī)則
初始解空間中,具有最優(yōu)目標函數(shù)值的人工狼即為頭狼;在迭代過程中,將每次迭代后最優(yōu)狼的目標函數(shù)值與前一代中頭狼的值進行比較,若更優(yōu)則對頭狼位置進行更新,若此時存在多匹的情況,則隨機選一匹成為頭狼。頭狼不執(zhí)行3種智能行為,直接進入迭代,直到被其他更強的人工狼代替。
4.2 游走行為
5 人工狼群算法的具體步驟:
6 BP神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與數(shù)學(xué)原理
此節(jié)的內(nèi)容 極!其!重!要!但是要涉及到一些數(shù)學(xué),所以我盡量用人話去跟大家細細解釋,并且結(jié)合實例來給大家進行一下分析。
這里一共是 11 組數(shù)據(jù)(數(shù)據(jù)量很少),很明顯 y 是關(guān)于 x1,x2,x3 的三元函數(shù),通常情況下,想要通過一套固定的套路來擬合出一個三元函數(shù)的關(guān)系式,是一件很復(fù)雜的事。而實際問題中的參數(shù)往往不止三個,可能成千上百,也就是說 決定 y 的參數(shù)會有很多,這樣的問題更是復(fù)雜的很,用常規(guī)的方法去擬合,幾乎不可能,那么換一種思路,用 Bp神經(jīng)網(wǎng)絡(luò)的方法來試一下。
根據(jù)上表給出的條件和問題,我們先來分析一下。首先,我們的輸入信息是 3 個參數(shù),x1,x2,x3 。輸出結(jié)果是 1 個數(shù) y 。那么可以畫一個這樣的關(guān)系網(wǎng)路圖(直接手畫了,湊合看吧···):
在這個網(wǎng)絡(luò)中,輸入層(input )有三個節(jié)點(因為有三個參數(shù)),隱藏層(hidden )先不表示,輸出層(output )有1個節(jié)點(因為我們要的結(jié)果只有一個 y )。那么關(guān)鍵的問題來了,如何進行這一通操作,它的結(jié)構(gòu)究竟是怎樣的?
6.1 正向傳播
正向傳播就是讓信息從輸入層進入網(wǎng)絡(luò),依次經(jīng)過每一層的計算,得到最終輸出層結(jié)果的過程。
我直接把設(shè)計好的結(jié)構(gòu)圖給大家畫出來,然后再一點一點地解釋。結(jié)構(gòu)如下:
看到這兒你可能會有點懵,不過不要緊,一步一步來分析。先來看網(wǎng)絡(luò)的結(jié)構(gòu),輸入層(input )沒有變,還是三個節(jié)點。輸出層(input )也沒有變。重點看隱藏層(hidden ),就是圖中紅色虛線框起的部分,這里我設(shè)計了一個隱藏層為兩層的網(wǎng)絡(luò),hidden_1和hidden_2 ,每層的節(jié)點為 2 個,至于為什么是兩層,節(jié)點數(shù)為什么是 2 兩個 ,這里你只需要知道,實驗證明,解決這個問題,這樣的網(wǎng)絡(luò)就夠用了。具體的一會兒講。
關(guān)鍵看一下連線代表的意義,和計算過程。可以從圖上看到,每層的節(jié)點都與下一層的每個節(jié)點有一一對應(yīng)的連線,每條連線代表一個權(quán)重,這里你可以把它理解為信息傳輸?shù)囊粭l通路,但是每條路的寬度是不一樣的,每條通路的寬度由該通道的參數(shù),也就是該通路的權(quán)重來決定。為了說明這個問題,拿一個節(jié)點的計算過程來進行說明,看下圖:
圖像來自百度百科,可以看到sigmoid函數(shù)能夠?qū)⒑瘮?shù)限制在 0到1 的范圍之內(nèi)。
這里還要進行一下說明,sigmoid 是最早使用的激勵函數(shù),實際上還有更多種類的激勵函數(shù) ,比如 Relu ,tanh 等等,性質(zhì)和表達式各有不同,以后再說,這里先用 sigmoid 來說明。
如果說看到這兒,你對 激勵函數(shù) 這個概念還是不太懂的話 ,沒關(guān)系,可以假裝自己明白了,你就知道這個東西很有用,里面必有道道就行了,以后慢慢體會,慢慢理解,就行了。接著往下看。
剛剛解釋了一個節(jié)點的計算過程,那么其他節(jié)點也就可以舉一反三,一一計算出來?,F(xiàn)在我們來簡化一下網(wǎng)絡(luò)。我們可以把x1,x2,x3作為一個向量 [x1,x2,x3] ,權(quán)重矩陣 u 也作為一個 3x2 的矩陣 ,w 作為一個 2x2 的矩陣 ,v作為一個 2x1 的矩陣,三個矩陣如下:
可以看到這三個矩陣與網(wǎng)絡(luò)中的結(jié)構(gòu)圖中是一一對應(yīng)的。下面我們把隱藏層與輸出層也寫成矩陣的形式:
可以看到這兩層隱藏層(hidden)的輸入Hi 與 Ho 均為 1x2 的矩陣,輸出層(output )為 1x1 的矩陣。下面就可以把網(wǎng)絡(luò)簡化為下面的結(jié)構(gòu):
根據(jù)我們剛才講過的每個節(jié)點的計算方法,以及我們簡化后的網(wǎng)絡(luò),則可以將整個計算過程等效的化為以下幾個矩陣相城的步驟(矩陣相乘是怎么會回事,請復(fù)習(xí)線性代數(shù)…):
注意:下式中,除sigmoid代表激勵函數(shù)以外,其余各個符號都代表一個矩陣(或者向量),而非常數(shù),乘積符號“ x ”代表常規(guī)的矩陣乘法計算。
6.2 反向傳播
那么有正向傳播,就必須得有反向傳播,下面來講一下 反向傳播 的過程。首先明確一點,反向傳播的信息是什么,不賣關(guān)子,直接給答案,反向傳播的信息是誤差,也就是 輸出層(output )的結(jié)果 與 輸入信息 x 對應(yīng)的真實結(jié)果 之間的差距(表達能力比較差,畫個圖說明…)。
拿出上文的數(shù)據(jù)表中的第一組數(shù)據(jù) x1 = 1,x2=1,x3=2,y=2 為例。
6.3 網(wǎng)絡(luò)的訓(xùn)練
通過一次正向傳播,和一次反向傳播,我們就可以將網(wǎng)絡(luò)的參數(shù)更新一次,所謂訓(xùn)練網(wǎng)絡(luò),就是讓正向傳播和反向傳播不斷的往復(fù)進行,不斷地更新網(wǎng)絡(luò)的參數(shù),最終使網(wǎng)絡(luò)能夠逼近真實的關(guān)系。
理論上,只要網(wǎng)絡(luò)的層數(shù)足夠深,節(jié)點數(shù)足夠多,可以逼近任何一個函數(shù)關(guān)系。但是這比較考驗?zāi)愕碾娔X性能,事實上,利用 Bp 網(wǎng)絡(luò),能夠處理的數(shù)據(jù)其實還是有限的,比如 Bp 網(wǎng)絡(luò)在圖像數(shù)據(jù)的識別和分類問題中的表現(xiàn)是很有限的。但是這并不影響 Bp 網(wǎng)絡(luò)是一種高明的策略,它的出現(xiàn)也為后來的 AI 技術(shù)做了重要的鋪墊
二、源代碼
%% 改進WPA-BP神經(jīng)網(wǎng)絡(luò)
%% 清空環(huán)境
clear all;
close all;
clc;
data=xlsread('Test.xlsx','Sheet1','A2:G46');%讀取數(shù)據(jù)
[M,NN]=size(data);%M是樣本數(shù),N是變量數(shù)
inputn=data(:,1:NN-1)';%訓(xùn)練樣本輸入
outputn=data(:,NN)';%訓(xùn)練樣本輸出
%節(jié)點個數(shù)
inputnum=NN-1;%輸入個數(shù)
hiddennum=12;%隱藏層
outputnum=1;%輸出個數(shù)
%構(gòu)建網(wǎng)絡(luò)
net=newff(inputn,outputn,hiddennum);
%% 狼群算法參數(shù)設(shè)置
tic
time = toc;
disp(['用時= ?',num2str(time)])
x=zbest;
%% 把最優(yōu)初始閥值權(quán)值賦予網(wǎng)絡(luò)預(yù)測
%% BP網(wǎng)絡(luò)訓(xùn)練
%網(wǎng)絡(luò)進化參數(shù)
net.trainParam.epochs=100;%bp神經(jīng)網(wǎng)絡(luò)的代數(shù)
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;
%網(wǎng)絡(luò)訓(xùn)練
[net,per2]=train(net,inputn,outputn);
%% BP網(wǎng)絡(luò)預(yù)測
% load data inputn_test output_test
inputn_test=inputn;%測試數(shù)據(jù)輸入
output_test=outputn;%測試數(shù)據(jù)輸出
an=sim(net,inputn_test);%預(yù)測
error=(an-output_test);%誤差
error_xiangdui=(an-output_test)./output_test;%相對誤差
figure(1)
plot(error_xiangdui,'ko-')
ylabel('相對誤差值')
title('狼群優(yōu)化BP神經(jīng)網(wǎng)絡(luò)')
figure(2)
plot(error,'ro-')
ylabel('誤差值')
title('狼群優(yōu)化BP神經(jīng)網(wǎng)絡(luò)')
figure(3)
plot(output_test,'r + -');
hold on;
plot(an,'b * -')
hold off
legend('真實值','預(yù)測值');
title('狼群優(yōu)化BP神經(jīng)網(wǎng)絡(luò)')
三、運行結(jié)果
?