基于遗传算法优化的BP神经网络的 非线性函数拟合
遺傳算法 ( GA , Genetic Algorithm ) ,也稱進(jìn)化算法 。 遺傳算法是受達(dá)爾文的進(jìn)化論的啟發(fā),借鑒生物進(jìn)化過程而提出的一種啟發(fā)式搜索算法。因此在介紹遺傳算法前有必要簡單的介紹生物進(jìn)化知識。
?
?
一.進(jìn)化論知識?
作為遺傳算法生物背景的介紹,下面內(nèi)容了解即可:
種群(Population):生物的進(jìn)化以群體的形式進(jìn)行,這樣的一個(gè)群體稱為種群。
個(gè)體:組成種群的單個(gè)生物。
基因?( Gene )?:一個(gè)遺傳因子。?
染色體?( Chromosome )?:包含一組的基因。
生存競爭,適者生存:對環(huán)境適應(yīng)度高的、牛B的個(gè)體參與繁殖的機(jī)會比較多,后代就會越來越多。適應(yīng)度低的個(gè)體參與繁殖的機(jī)會比較少,后代就會越來越少。
遺傳與變異:新個(gè)體會遺傳父母雙方各一部分的基因,同時(shí)有一定的概率發(fā)生基因變異。
?
簡單說來就是:繁殖過程,會發(fā)生基因交叉( Crossover ) ,基因突變 ( Mutation ) ,適應(yīng)度( Fitness )低的個(gè)體會被逐步淘汰,而適應(yīng)度高的個(gè)體會越來越多。那么經(jīng)過N代的自然選擇后,保存下來的個(gè)體都是適應(yīng)度很高的,其中很可能包含史上產(chǎn)生的適應(yīng)度最高的那個(gè)個(gè)體。
?
?
二.遺傳算法思想?
借鑒生物進(jìn)化論,遺傳算法將要解決的問題模擬成一個(gè)生物進(jìn)化的過程,通過復(fù)制、交叉、突變等操作產(chǎn)生下一代的解,并逐步淘汰掉適應(yīng)度函數(shù)值低的解,增加適應(yīng)度函數(shù)值高的解。這樣進(jìn)化N代后就很有可能會進(jìn)化出適應(yīng)度函數(shù)值很高的個(gè)體。
舉個(gè)例子,使用遺傳算法解決“0-1背包問題”的思路:0-1背包的解可以編碼為一串0-1字符串(0:不取,1:取) ;首先,隨機(jī)產(chǎn)生M個(gè)0-1字符串,然后評價(jià)這些0-1字符串作為0-1背包問題的解的優(yōu)劣;然后,隨機(jī)選擇一些字符串通過交叉、突變等操作產(chǎn)生下一代的M個(gè)字符串,而且較優(yōu)的解被選中的概率要比較高。這樣經(jīng)過G代的進(jìn)化后就可能會產(chǎn)生出0-1背包問題的一個(gè)“近似最優(yōu)解”。
?
編碼:需要將問題的解編碼成字符串的形式才能使用遺傳算法。最簡單的一種編碼方式是二進(jìn)制編碼,即將問題的解編碼成二進(jìn)制位數(shù)組的形式。例如,問題的解是整數(shù),那么可以將其編碼成二進(jìn)制位數(shù)組的形式。將0-1字符串作為0-1背包問題的解就屬于二進(jìn)制編碼。
?
遺傳算法有3個(gè)最基本的操作:選擇,交叉,變異。
?
選擇:選擇一些染色體來產(chǎn)生下一代。一種常用的選擇策略是?“比例選擇”,也就是個(gè)體被選中的概率與其適應(yīng)度函數(shù)值成正比。假設(shè)群體的個(gè)體總數(shù)是M,那么那么一個(gè)體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例選擇實(shí)現(xiàn)算法就是所謂的“輪盤賭算法”( Roulette Wheel Selection ) ,輪盤賭算法的一個(gè)簡單的實(shí)現(xiàn)如下:
?
輪盤賭算法 /** 按設(shè)定的概率,隨機(jī)選中一個(gè)個(gè)體
* P[i]表示第i個(gè)個(gè)體被選中的概率
*/
int?RWS()
{
m?=0;
r?=Random(0,1);?//r為0至1的隨機(jī)數(shù)
for(i=1;i<=N; i++)
{
/*?產(chǎn)生的隨機(jī)數(shù)在m~m+P[i]間則認(rèn)為選中了i
* 因此i被選中的概率是P[i]
*/
m?=?m?+?P[i];
if(r<=m)?return?i;
}
}
?
交叉(Crossover):2條染色體交換部分基因,來構(gòu)造下一代的2條新的染色體。例如:
交叉前:
00000|011100000000|10000
11100|000001111110|00101
交叉后:
00000|000001111110|10000
11100|011100000000|00101
染色體交叉是以一定的概率發(fā)生的,這個(gè)概率記為Pc 。
?
變異(Mutation):在繁殖過程,新產(chǎn)生的染色體中的基因會以一定的概率出錯(cuò),稱為變異。變異發(fā)生的概率記為Pm 。例如:
變異前:
000001110000000010000
變異后:
000001110000100010000
?
適應(yīng)度函數(shù)?( Fitness Function ):用于評價(jià)某個(gè)染色體的適應(yīng)度,用f(x)表示。有時(shí)需要區(qū)分染色體的適應(yīng)度函數(shù)與問題的目標(biāo)函數(shù)。例如:0-1背包問題的目標(biāo)函數(shù)是所取得物品價(jià)值,但將物品價(jià)值作為染色體的適應(yīng)度函數(shù)可能并不一定適合。適應(yīng)度函數(shù)與目標(biāo)函數(shù)是正相關(guān)的,可對目標(biāo)函數(shù)作一些變形來得到適應(yīng)度函數(shù)。
?
遺傳算法優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)算法流程:
主要用遺傳算法求得BP神經(jīng)網(wǎng)絡(luò)的初始權(quán)值和偏置,網(wǎng)絡(luò)經(jīng)訓(xùn)練后預(yù)測函數(shù)輸出;
遺傳算法優(yōu)化BP神經(jīng)網(wǎng)絡(luò)是用遺傳算法優(yōu)化BP神經(jīng)網(wǎng)絡(luò)的初始權(quán)值和閾值,使優(yōu)化后的bP神經(jīng)網(wǎng)絡(luò)更好的預(yù)測函數(shù)輸出,遺傳算法主要包含下面的操作:
1、種群初始化
個(gè)體編碼方法為實(shí)數(shù)編碼,每個(gè)個(gè)體均為一個(gè)實(shí)數(shù)串,由輸入層與隱含層之間的權(quán)重偏置和隱含層和輸出層之間的權(quán)重和額偏置,構(gòu)成,
2、適應(yīng)度計(jì)算
根據(jù)得到BP神經(jīng)網(wǎng)絡(luò)的初始權(quán)重和閾值,用訓(xùn)練數(shù)據(jù)訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)后的預(yù)測系統(tǒng)輸出,吧預(yù)測輸出和期望輸出之間的誤差絕對值作為個(gè)體適應(yīng)度
3、選擇操作
遺傳算法選擇操作有輪盤讀法,錦標(biāo)塞閥等多種方法,選擇算法根據(jù)個(gè)體的適應(yīng)度內(nèi)進(jìn)行選擇,適應(yīng)度越小越好,
4、交差操作、
由于個(gè)體采用實(shí)數(shù)編碼,所交叉操作采用實(shí)數(shù)交叉法,第K和第j個(gè)染色體中第m和第n個(gè)進(jìn)行交叉
5、變異操作
選取個(gè)體i中第j個(gè)位置進(jìn)行變異
編程的方法:
<span style="font-size:18px;">%讀取數(shù)據(jù) load data input output %% %節(jié)點(diǎn)個(gè)數(shù) inputnum=2; hiddennum=5; outputnum=1;%訓(xùn)練數(shù)據(jù)和預(yù)測數(shù)據(jù) input_train=input(1:1900,:)'; input_test=input(1901:2000,:)'; output_train=output(1:1900)'; output_test=output(1901:2000)';%選連樣本輸入輸出數(shù)據(jù)歸一化 [inputn,inputps]=mapminmax(input_train); [outputn,outputps]=mapminmax(output_train);%構(gòu)建網(wǎng)絡(luò) net=newff(inputn,outputn,hiddennum);%% 遺傳算法參數(shù)初始化 maxgen=20; %進(jìn)化代數(shù),即迭代次數(shù) sizepop=10; %種群規(guī)模 pcross=[0.2]; %交叉概率選擇,0和1之間 pmutation=[0.1]; %變異概率選擇,0和1之間%節(jié)點(diǎn)總數(shù) numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;lenchrom=ones(1,numsum); bound=[-3*ones(numsum,1) 3*ones(numsum,1)]; %數(shù)據(jù)范圍%------------------------------------------------------種群初始化-------------------------------------------------------- individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個(gè)結(jié)構(gòu)體 avgfitness=[]; %每一代種群的平均適應(yīng)度 bestfitness=[]; %每一代種群的最佳適應(yīng)度 bestchrom=[]; %適應(yīng)度最好的染色體 %初始化種群 for i=1:sizepop%隨機(jī)產(chǎn)生一個(gè)種群individuals.chrom(i,:)=Code(lenchrom,bound); %編碼(binary和grey的編碼結(jié)果為一個(gè)實(shí)數(shù),float的編碼結(jié)果為一個(gè)實(shí)數(shù)向量)x=individuals.chrom(i,:);%計(jì)算適應(yīng)度individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); %染色體的適應(yīng)度 end FitRecord=[]; %找最好的染色體 [bestfitness bestindex]=min(individuals.fitness); bestchrom=individuals.chrom(bestindex,:); %最好的染色體 avgfitness=sum(individuals.fitness)/sizepop; %染色體的平均適應(yīng)度 % 記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度 trace=[avgfitness bestfitness]; %% 迭代求解最佳初始閥值和權(quán)值 % 進(jìn)化開始 for i=1:maxgeni% 選擇individuals=Select(individuals,sizepop); avgfitness=sum(individuals.fitness)/sizepop;%交叉individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);% 變異individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);% 計(jì)算適應(yīng)度 for j=1:sizepopx=individuals.chrom(j,:); %解碼individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); end%找到最小和最大適應(yīng)度的染色體及它們在種群中的位置[newbestfitness,newbestindex]=min(individuals.fitness);[worestfitness,worestindex]=max(individuals.fitness);% 代替上一次進(jìn)化中最好的染色體if bestfitness>newbestfitnessbestfitness=newbestfitness;bestchrom=individuals.chrom(newbestindex,:);endindividuals.chrom(worestindex,:)=bestchrom;individuals.fitness(worestindex)=bestfitness;avgfitness=sum(individuals.fitness)/sizepop;trace=[trace;avgfitness bestfitness]; %記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度FitRecord=[FitRecord;individuals.fitness]; end%% 遺傳算法結(jié)果分析 figure(1) [r c]=size(trace); plot([1:r]',trace(:,2),'b--'); title(['適應(yīng)度曲線 ' '終止代數(shù)=' num2str(maxgen)]); xlabel('進(jìn)化代數(shù)');ylabel('適應(yīng)度'); legend('平均適應(yīng)度','最佳適應(yīng)度'); disp('適應(yīng)度 變量'); </span>
把最優(yōu)初始閥值權(quán)值賦予網(wǎng)絡(luò)預(yù)測
<span style="font-size:18px;">%% 把最優(yōu)初始閥值權(quán)值賦予網(wǎng)絡(luò)預(yù)測 % %用遺傳算法優(yōu)化的BP網(wǎng)絡(luò)進(jìn)行值預(yù)測 x=bestchrom; 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}=B2;%% BP網(wǎng)絡(luò)訓(xùn)練 %網(wǎng)絡(luò)進(jìn)化參數(shù) net.trainParam.epochs=100; 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ù)測 %數(shù)據(jù)歸一化 inputn_test=mapminmax('apply',input_test,inputps); an=sim(net,inputn_test); test_simu=mapminmax('reverse',an,outputps); error=test_simu-output_test; </span>
總結(jié)
以上是生活随笔為你收集整理的基于遗传算法优化的BP神经网络的 非线性函数拟合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Prod 函数
- 下一篇: 利用神经网络 遗传算法求得函数极小极大值