遺傳演算法優化bp網路
⑴ 遺傳演算法優化bp神經網路,訓練好後,做預測會更加准確求大神告知!
1、遺傳演算法優化BP神經網路是指優化神經網路的參數; 2、因此,對訓練時間沒有影響。
⑵ 利用遺傳演算法優化的bp神經網路怎麼畫出誤差與訓練時間的變化
這個得靠你自己編程實現,沒有現成的函數。具體流程如下:
初始化:將各個權值、閾值都作為實數編碼,構成染色體,並產生初始種群;
選擇、交叉、變異:注意各個概率和交叉方式;
檢驗:將染色體解碼進神經網路,代入樣本計算誤差。可能你還可以使用最優個體保存策略。
循環迭代上述過程,直至誤差滿足條件。
將遺傳演算法的代數和誤差記錄下來,用plot函數就可以畫出變化曲線了。
⑶ matlab的遺傳演算法優化BP神經網路
對y=x1^2+x2^2非線性系統進行建模,用1500組數據對網路進行構建網路,500組數據測試網路。由於BP神經網路初始神經元之間的權值和閾值一般隨機選擇,因此容易陷入局部最小值。本方法使用遺傳演算法優化初始神經元之間的權值和閾值,並對比使用遺傳演算法前後的效果。
步驟:
未經遺傳演算法優化的BP神經網路建模
1、
隨機生成2000組兩維隨機數(x1,x2),並計算對應的輸出y=x1^2+x2^2,前1500組數據作為訓練數據input_train,後500組數據作為測試數據input_test。並將數據存儲在data中待遺傳演算法中使用相同的數據。
2、
數據預處理:歸一化處理。
3、
構建BP神經網路的隱層數,次數,步長,目標。
4、
使用訓練數據input_train訓練BP神經網路net。
⑷ 關於遺傳演算法優化BP神經網路的問題
程序:
1、未經遺傳演算法優化的BP神經網路建模
clear;
clc;
%%%%%%%%%%%%%輸入參數%%%%%%%%%%%%%%
N=2000; %數據總個數
M=1500; %訓練數據
%%%%%%%%%%%%%訓練數據%%%%%%%%%%%%%%
for i=1:N
input(i,1)=-5+rand*10;
input(i,2)=-5+rand*10;
end
output=input(:,1).^2+input(:,2).^2;
save data input output
load data.mat
%從1到N隨機排序
k=rand(1,N);
[m,n]=sort(k);
%找出訓練數據和預測數據
input_train=input(n(1:M),:)';
output_train=output(n(1:M),:)';
input_test=input(n((M+1):N),:)';
output_test=output(n((M+1):N),:)';
%數據歸一化
[inputn,inputs]=mapminmax(input_train);
[outputn,outputs]=mapminmax(output_train);
%構建BP神經網路
net=newff(inputn,outputn,5);
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;
%BP神經網路訓練
net=train(net,inputn,outputn);
%測試樣本歸一化
inputn_test=mapminmax('apply',input_test,inputs);
%BP神經網路預測
an=sim(net,inputn_test);
%%網路得到數據反歸一化
BPoutput=mapminmax('reverse',an,outputs);
figure(1)
%plot(BPoutput,':og');
scatter(1:(N-M),BPoutput,'rx');
hold on;
%plot(output_test,'-*');
scatter(1:(N-M),output_test,'o');
legend('預測輸出','期望輸出','fontsize',12);
title('BP網路預測輸出','fontsize',12);
xlabel('樣本','fontsize',12);
xlabel('優化前輸出的誤差','fontsize',12);
figure(2)
error=BPoutput-output_test;
plot(1:(N-M),error);
xlabel('樣本','fontsize',12);
ylabel('優化前輸出的誤差','fontsize',12);
%save net net inputs outputs
2、遺傳演算法優化的BP神經網路建模
(1)主程序
%清空環境變數
clc
clear
%讀取數據
load data.mat
%節點個數
inputnum=2;
hiddennum=5;
outputnum=1;
%訓練數據和預測數據
input_train=input(1:1500,:)';
input_test=input(1501:2000,:)';
output_train=output(1:1500)';
output_test=output(1501:2000)';
%選連樣本輸入輸出數據歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%構建網路
net=newff(inputn,outputn,hiddennum);
%% 遺傳演算法參數初始化
maxgen=10; %進化代數,即迭代次數
sizepop=30; %種群規模
pcross=[0.3]; %交叉概率選擇,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)]; %數據范圍
%------------------------------------------------------種群初始化------------------------------%------------------
--------
indivials=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個結構體
%avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%初始化種群
for i=1:sizepop
%隨機產生一個種群
indivials.chrom(i,:)=Code(lenchrom,bound); %編碼
x=indivials.chrom(i,:);
%計算適應度
indivials.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
%avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
%trace=[avgfitness bestfitness];
%% 迭代求解最佳初始閥值和權值
% 進化開始
for i=1:maxgen
i
% 選擇
indivials=Select(indivials,sizepop);
% avgfitness=sum(indivials.fitness)/sizepop;
%交叉
indivials.chrom=Cross(pcross,lenchrom,indivials.chrom,sizepop,bound);
% 變異
indivials.chrom=Mutation(pmutation,lenchrom,indivials.chrom,sizepop,i,maxgen,bound);
% 計算適應度
for j=1:sizepop
x=indivials.chrom(j,:); %解碼
indivials.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(indivials.fitness);
[worestfitness,worestindex]=max(indivials.fitness);
% 代替上一次進化中最好的染色體
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=indivials.chrom(newbestindex,:);
end
indivials.chrom(worestindex,:)=bestchrom;
indivials.fitness(worestindex)=bestfitness;
%avgfitness=sum(indivials.fitness)/sizepop;
% trace=[trace;avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度
end
%% 遺傳演算法結果分析
%figure(3)
%[r c]=size(trace);
%plot([1:r]',trace(:,2),'b--');
%title(['適應度曲線 ' '終止代數=' num2str(maxgen)]);
%xlabel('進化代數');ylabel('適應度');
%legend('平均適應度','最佳適應度');
disp('適應度 變數');
x=bestchrom;
%% 把最優初始閥值權值賦予網路預測
% %用遺傳演算法優化的BP網路進行值預測
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;
%figure(4);
hold on;plot(1:500,error,'r');
legend('優化前的誤差','優化後的誤差','fontsize',12)
(2)編碼子程序code.m
function ret=Code(lenchrom,bound)
%本函數將變數編碼成染色體,用於隨機初始化一個種群
% lenchrom input : 染色體長度
% bound input : 變數的取值范圍
% ret output: 染色體的編碼值
flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %線性插值,編碼結果以實數向量存入ret中
flag=test(lenchrom,bound,ret); %檢驗染色體的可行性
end
(3)適應度函數fun.m
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
%該函數用來計算適應度值
%x input 個體
%inputnum input 輸入層節點數
%outputnum input 隱含層節點數
%net input 網路
%inputn input 訓練輸入數據
%outputn input 訓練輸出數據
%error output 個體適應度值
%提取
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=newff(inputn,outputn,hiddennum);
%網路進化參數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
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;
%網路訓練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(abs(an-outputn));
(4)選擇操作Select.m
function ret=select(indivials,sizepop)
% 該函數用於進行選擇操作
% indivials input 種群信息
% sizepop input 種群規模
% ret output 選擇後的新種群
%求適應度值倒數
[a bestch]=min(indivials.fitness);
%b=indivials.chrom(bestch);
%c=indivials.fitness(bestch);
fitness1=10./indivials.fitness; %indivials.fitness為個體適應度值
%個體選擇概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%採用輪盤賭法選擇新個體
index=[];
for i=1:sizepop %sizepop為種群數
pick=rand;
while pick==0
pick=rand;
end
for i=1:sizepop
pick=pick-sumf(i);
if pick<0
index=[index i];
break;
end
end
end
%index=[index bestch];
%新種群
indivials.chrom=indivials.chrom(index,:); %indivials.chrom為種群中個體
indivials.fitness=indivials.fitness(index);
%indivials.chrom=[indivials.chrom;b];
%indivials.fitness=[indivials.fitness;c];
ret=indivials;
(5)交叉操作cross.m
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函數完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色體的長度
% chrom input : 染色體群
% sizepop input : 種群規模
% ret output : 交叉後的染色體
for i=1:sizepop %每一輪for循環中,可能會進行一次交叉操作,染色體是隨機選擇的,交叉位置也是隨機選擇的,%但該輪for循環中是否進行交叉操作則由交叉概率決定(continue控制)
% 隨機選擇兩個染色體進行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率決定是否進行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
flag=0;
while flag==0
% 隨機選擇交叉位
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %隨機選擇進行交叉的位置,即選擇第幾個變數進行交叉,注意:兩個染色體交叉的位置相同
pick=rand; %交叉開始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉結束
flag1=test(lenchrom,bound,chrom(index(1),:)); %檢驗染色體1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %檢驗染色體2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果兩個染色體不是都可行,則重新交叉
end
end
ret=chrom;
(6)變異操作Mutation.m
function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
% 本函數完成變異操作
% pcorss input : 變異概率
% lenchrom input : 染色體長度
% chrom input : 染色體群
% sizepop input : 種群規模
% opts input : 變異方法的選擇
% pop input : 當前種群的進化代數和最大的進化代數信息
% bound input : 每個個體的上屆和下屆
% maxgen input :最大迭代次數
% num input : 當前迭代次數
% ret output : 變異後的染色體
for i=1:sizepop %每一輪for循環中,可能會進行一次變異操作,染色體是隨機選擇的,變異位置也是隨機選擇的,
%但該輪for循環中是否進行變異操作則由變異概率決定(continue控制)
% 隨機選擇一個染色體進行變異
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop);
% 變異概率決定該輪循環是否進行變異
pick=rand;
if pick>pmutation
continue;
end
flag=0;
while flag==0
% 變異位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom)); %隨機選擇了染色體變異的位置,即選擇了第pos個變數進行變異
pick=rand; %變異開始
fg=(rand*(1-num/maxgen))^2;
if pick>0.5
chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;
else
chrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;
end %變異結束
flag=test(lenchrom,bound,chrom(i,:)); %檢驗染色體的可行性
end
end
ret=chrom;
⑸ 遺傳演算法為什麼可以優化bp神經網路
遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。遺傳演算法是從代表問題可能潛在的解集的一個種群(population)開始的,而一個種群則由經過基因(gene)編碼的一定數目的個體(indivial)組成。每個個體實際上是染色體(chromosome)帶有特徵的實體。染色體作為遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現,如黑頭發的特徵是由染色體中控制這一特徵的某種基因組合決定的。因此,在一開始需要實現從表現型到基因型的映射即編碼工作。由於仿照基因編碼的工作很復雜,我們往往進行簡化,如二進制編碼,初代種群產生之後,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇(selection)個體,並藉助於自然遺傳學的遺傳運算元(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的後生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。
⑹ 求教遺傳演算法優化兩層隱含層結構的BP神經網路的問題
這四個都屬於人工智慧演算法的范疇。其中BP演算法、BP神經網路和神經網路 屬於神經網路這個大類。遺傳演算法為進化演算法這個大類。 神經網路模擬人類大腦神經計算過程,可以實現高度非線性的預測和計算,主要用於非線性擬合,識別,特點是需要「訓練」,
⑺ 用遺傳演算法優化bp神經網路,訓練變快!是怎麼回事
1、遺傳演算法優化BP神經網路是指優化神經網路的參數; 2、因此,對訓練時間沒有影響。
⑻ c語言實現*/遺傳演算法改進BP神經網路原理和演算法實現怎麼弄
遺傳演算法有相當大的引用。遺傳演算法在游戲中應用的現狀在遺傳編碼時, 一般將瓦片的坐標作為基因進行實數編碼, 染色體的第一個基因為起點坐標, 最後一個基因為終點坐標, 中間的基因為路徑經過的每一個瓦片的坐標。在生成染色體時, 由起點出發, 隨機選擇當前結點的鄰居節點中的可通過節點, 將其坐標加入染色體, 依此循環, 直到找到目標點為止, 生成了一條染色體。重復上述操作, 直到達到指定的種群規模。遺傳演算法的優點:1、遺傳演算法是以決策變數的編碼作為運算對象,可以直接對集合、序列、矩陣、樹、圖等結構對象進行操作。這樣的方式一方面有助於模擬生物的基因、染色體和遺傳進化的過程,方便遺傳操作運算元的運用。另一方面也使得遺傳演算法具有廣泛的應用領域,如函數優化、生產調度、自動控制、圖像處理、機器學習、數據挖掘等領域。2、遺傳演算法直接以目標函數值作為搜索信息。它僅僅使用適應度函數值來度量個體的優良程度,不涉及目標函數值求導求微分的過程。因為在現實中很多目標函數是很難求導的,甚至是不存在導數的,所以這一點也使得遺傳演算法顯示出高度的優越性。3、遺傳演算法具有群體搜索的特性。它的搜索過程是從一個具有多個個體的初始群體P(0)開始的,一方面可以有效地避免搜索一些不必搜索的點。另一方面由於傳統的單點搜索方法在對多峰分布的搜索空間進行搜索時很容易陷入局部某個單峰的極值點,而遺傳演算法的群體搜索特性卻可以避免這樣的問題,因而可以體現出遺傳演算法的並行化和較好的全局搜索性。4、遺傳演算法基於概率規則,而不是確定性規則。這使得搜索更為靈活,參數對其搜索效果的影響也盡可能的小。5、遺傳演算法具有可擴展性,易於與其他技術混合使用。以上幾點便是遺傳演算法作為優化演算法所具備的優點。遺傳演算法的缺點:遺傳演算法在進行編碼時容易出現不規范不準確的問題。