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