1. 程式人生 > >基於遺傳演算法優化的BP神經網路的 非線性函式擬合

基於遺傳演算法優化的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()
{
=0;
=Random(0,1); //r為0至1的隨機數for(i=1;i<=N; i++)
{
/* 產生的隨機數在m~m+P[i]間則認為選中了i
* 因此i被選中的概率是P[i]
*/
= 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:maxgen
    i
    % 選擇
    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:sizepop
        x=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>newbestfitness
        bestfitness=newbestfitness;
        bestchrom=individuals.chrom(newbestindex,:);
    end
    individuals.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神經網路優化演算法

遺傳演算法優化BP神經網路分為BP神經網路結構確定、遺傳演算法優化和 BP神經網路預測3個部分。其中,BP神經網路結構確定部分根據擬合函式輸入輸出引數個數確定 BP神經網路結構,這樣就可以確定遺傳演算法的優化引數個數,進而確定遺傳演算法個體的編碼長度。因為遺傳演

(轉)用遺傳演算法優化BP神經網路的Matlab程式設計例項

此文章首次在simwe公開發表,屬於GreenSim團隊原創作品,轉載請註明!由於BP網路的權值優化是一個無約束優化問題,而且權值要採用實數編碼,所以直接利用Matlab遺傳演算法工具箱。以下貼出的程式碼是為一個19輸入變數,1個輸出變數情況下的非線性迴歸而設計的,如果要應用於其它情況,只需改動編解碼函式即可

基於遺傳演算法優化BP神經網路非線性函式

遺傳演算法 ( GA , Genetic Algorithm ) ,也稱進化演算法 。 遺傳演算法是受達爾文的進化論的啟發,借鑑生物進化過程而提出的一種啟發式搜尋演算法。因此在介紹遺傳演算法前有必要簡單的介紹生物進化知識。 一.進化論知識    作為遺傳演算法生物

粒子群優化演算法BP神經網路優化 Matlab實現

1、粒子群優化演算法 粒子群演算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,該演算法模擬鳥叢集飛行覓食的行為,鳥之間通過集體的協作使群體達到最優目的,是一種基於 Swarm Inteligence的優化方法。同遺傳演算法類似,也是一種

深入淺出|深度學習演算法BP神經網路 詳細公式推導

所謂神經網路,目前用得最廣泛的一個定義是“的神經網路是由具有適應性簡單單元組成的廣泛並行互連的網路,它的組織能夠模擬生物神經系統對真實世界物體所做出的互動反應”。 BP(back propagation)神經網絡一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用

C++實現誤差反向傳播演算法BP神經網路

誤差反向傳播學習演算法 實現Iris資料分類 Denverg Secret Number 29,April 2018 實驗目的 用C++實現BP神經網路 實驗原理 人工神經網路模型 人們從40年代開始研究人腦神經元功能。1943年

基於tensorflow的簡單BP神經網路的結構搭建

tensorflow的構建封裝的更加完善,可以任意加入中間層,只要注意好維度即可,不過numpy版的神經網路程式碼經過適當地改動也可以做到這一點,這裡最重要的思想就是層的模型的分離。下面介紹關於tensorflow的構建神經網路的方法,特此記錄。 import tensorflow as tf  

利用BP神經網路逼近函式——Python實現

  文章主要參考https://blog.csdn.net/john_bian/article/details/79503572,原文是matlab版本的實現。在此基礎上,利用Python實現BP網路對函式的逼近。對於BP神經網路的基本原理以及推倒,這裡就不再贅述,可以查閱相

BP神經網路函式逼近功能

BP網路有很強的對映能力,主要用於模式識別和函式逼近。可以採用BP網路函式逼近的能力來求解數學式難以表達的函式。下面是一個三層BP網路,看它如何逼近一個正旋函式的。 在matlab中採用tansig函式和purelin函式,BP網路未訓練時(初始化的網路),輸出曲線與正旋曲線

神經網路於過

“Small” neural network (fewer parameters; more prone to underfitting) Computationally cheaper "Large" neural network (more parameters; more prone to over

神經網路之過(附程式碼)

摘要 監督機器學習問題無非就是“minimizeyour error while regularizing your parameters”,也就是在規則化引數的同時最小化誤差。最小化誤差是為了讓我們的模型擬合我們的訓練資料,而規則化引數是防止我們的模型過分擬合我們的訓練資料

CNN-卷積神經網路防止過的方法

過擬合出現的原因 訓練的資料過少,無法準確獲得資料中的特徵 全連線神經網路中引數增多也會導致過擬合問題(還可以導致計算速度減慢) 過擬合解決的辦法 1. data augmentation: 這點不需要解釋太多,所有的過擬合無非就是訓練樣本的

遺傳演算法+BP神經網路組合求解非線性函式

用遺傳演算法求解非線性問題是常見的求解演算法之一,求解的過程就是隨機生成解,計算適應度,然後選擇,交叉,變異,更新種群,不斷迭代,這樣,每個個體都會向每代中最佳的個體學習並靠攏,這是區域性最優解;而變異操作是為了在靠近當前最優解的同時還有機會變異出更佳的基因,從而跳出區域性最優解而達到全域性最優解。

[純C#實現]基於BP神經網路的中文手寫識別演算法

效果展示 這不是OCR,有些人可能會覺得這東西會和OCR一樣,直接進行整個字的識別就行,然而並不是. OCR是2維畫素矩陣的畫素資料.而手寫識別不一樣,手寫可以把使用者寫字的筆畫時間順序,抽象成一個維度.這樣識別的就是3維的資料了.識別起來簡單很多. 最近需要做一箇中文手寫識別演算法.搜尋了網上的

BP神經網路的各種優化演算法

loss一直在波動,沒有收斂的趨勢,以為自己訓練有問題, 後來看了SGD的介紹,再瞭解這屬於正常的,具體看下面介紹吧。 ==========================================================================

BP神經網路基於Tensorflow的實現(程式碼註釋詳細)

BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。 在一般的BP神經網路中,單個樣本有m個輸入和n個輸出,在輸入層

BP神經網路演算法的理解

BP神經網路在百度百科中的解釋就是:BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。大家應該對基本的神經網路模型有一定程度的瞭解,

Python基於K-均值、RLS演算法實現RBF神經網路神經網路與機器學習 第五章 計算機實驗)

1、生成資料集 class moon_data_class(object): def __init__(self,N,d,r,w): self.N=N self.w=w self.d=d self.r=r

神經網路學習(三)——BP神經網路演算法

前面學習了感知器和自適應線性神經網路。 下面介紹經典的三層神經網路結構,其中每個神經元的啟用函式採用Sigmoid。PS:不同的應用場景,神經網路的結構要有針對性的設計,這裡僅僅是為了推導演算法和計算方便才採用這個簡單的結構。 訓練步驟: 1.正向傳播 2.反向傳播(BP)

基於PCA與BP神經網路的人臉識別

基於PCA與BP神經網路的人臉識別 引言 1、PCA演算法 2、PCA原理推導 3、神經網路 4、matlab程式碼 5、C++程式碼 引言 前面的特徵提取部分採用的是PCA,後面的識別分類