m基于GA遗传优化BP神经网络的传感器故障诊断matlab仿真

1.算法描述

遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉,变异过程产生更适应环境的新一代“染色体”群。这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解。


其主要步骤如下:


1.初始化


选择一个群体,即选择一个串或个体的集合bi,i=1,2,...n。这个初始的群体也就是问题假设解的集合。一般取n=30-160。


通常以随机方法产生串或个体的集合bi,i=1,2,...n。问题的最优解将通过这些初始假设解进化而求出。


2.选择


根据适者生存原则选择下一代的个体。在选择时,以适应度为选择原则。适应度准则体现了适者生存,不适应者淘汰的自然法则。


给出目标函数f,则f(bi)称为个体bi的适应度。以


为选中bi为下一代个体的次数。


显然.从式(3—86)可知:


(1)适应度较高的个体,繁殖下一代的数目较多。


(2)适应度较小的个体,繁殖下一代的数目较少;甚至被淘汰。


这样,就产生了对环境适应能力较强的后代。对于问题求解角度来讲,就是选择出和最优解较接近的中间解。


3.交叉


对于选中用于繁殖下一代的个体,随机地选择两个个体的相同位置,按交叉概率P。在选中的位置实行交换。这个过程反映了随机信息交换;目的在于产生新的基因组合,也即产生新的个体。交叉时,可实行单点交叉或多点交叉。



在BP神经网络中,隐含层数量对神经网络的性能有着至关重要的影响,如果隐含层数量过多,会大大增加BP神经网络的内部结构的复杂度,从而降低学习效率,增加训练时间;如果隐含层数量过少,则无法精确获得训练输入数据和输出结果之间的内在规律,增加预测误差。因此,选择合适的隐含层个数具有十分重要的意义。由于隐含层个数的设置没有明确的理论可以计算,通常情况下,采用逐次分析的方法获得,即通过对不同隐含层所对应的神经网络进行预测误差的仿真分析,选择误差最小情况下所对应的隐含层个数。


学习率,即网络权值得更新速度,当学习率较大的时候,网络权值的更新速度快,当网络稳定性会下降;当学习率较小的时候,网络权值的更新速度慢,网络较为稳定。这里选择BP神经网络的学习率方式参考上一章节隐含层的选择方式,即通过对比不同学习率的网络训练误差,选择性能较优的学习率。


BP神经网络的初始网络权值对网络训练的效率以及预测性能有着较大的影响,通常情况下,采用随机生成[-1,1]之间的随机数作为BP神经网络的初始权值。     


利用遗传算法来优化BP 神经网络,利用它来学习神经网络 的权值,并在自适应遗传算法的基础上改进遗传算 子,根据适应度变化调节交叉率和变异率,并利用遗 传算法的全局搜索能力对BP 神经网络的初始权重进 行自适应调整,最终得到一个优化的 BP 神经网络.


2.仿真效果预览

matlab2022a仿真结果如下:


3.MATLAB核心程序

fit_mean  = [];                      

fit_best  = [];                     

fit_chrom = [];                       

%最好染色体

[fit_best,ind_best] = min(gts.fitness);

fit_chrom           = gts.chrom(ind_best,:);  

fit_mean            = sum(gts.fitness)/Pop_Size;


Fitness_line        = zeros(1,Max_G);


for i=1:Max_G

i

if i == 1

P1s = P1*ones(1,Pop_Size);

P2s = P2*ones(1,Pop_Size);;

else

fmax = max(gts.fitness);

f_   = mean(gts.fitness);

f    = gts.fitness;

for j = 1:Pop_Size;

if f(j) >= f_

P1s(j) = 0.5*(fmax-f(j))/(fmax-f_);  

else

P1s(j) = 0.5;   

end

end

for j = 1:Pop_Size;

P2s(j) = 1-P1s(j);  

end

end



%遗传选择

gts       = func_select(gts,Pop_Size);

fit_mean  = sum(gts.fitness)/Pop_Size;

%遗传交叉

gts.chrom = func_cross(P1s,Lroms,gts.chrom,Pop_Size,bound);

%变异

gts.chrom = func_mutation(P2s,Lroms,gts.chrom,Pop_Size,i,Max_G,bound);

%计算适应度

for j=1:Pop_Size

Xx             = gts.chrom(j,:);

gts.fitness(j) = func_fitness(Xx,Num_In,Num_Hidden,Num_Out,net,train_data,train_aim);   

end

[fit_best2,ind_best2] = min(gts.fitness);

[fit_worst,ind_worst] = max(gts.fitness);


if fit_best > fit_best2

fit_best  = fit_best2;

fit_chrom = gts.chrom(ind_best2,:);

end

gts.chrom(ind_worst,:) = fit_chrom;

gts.fitness(ind_worst) = fit_best;

fit_mean               = sum(gts.fitness)/Pop_Size;

Fitness_line(i)        = fit_best;

end

Xx=fit_chrom;




%把最优初始阀值权值赋予网络预测

L1 = 1;

L2 = Num_In*Num_Hidden;

w1 = Xx(L1:L2);


L1 = Num_In*Num_Hidden+1;

L2 = Num_In*Num_Hidden+Num_Hidden;

B1 = Xx(L1:L2);


L1 = Num_In*Num_Hidden+Num_Hidden+1;

L2 = Num_In*Num_Hidden+Num_Hidden+Num_Hidden*Num_Out;

w2 = Xx(L1:L2);


L1 = Num_In*Num_Hidden+Num_Hidden+Num_Hidden*Num_Out+1;

L2 = Num_In*Num_Hidden+Num_Hidden+Num_Hidden*Num_Out+Num_Out;

B2 = Xx(L1:L2);



net.iw{1,1}=reshape(w1,Num_Hidden,Num_In);

net.lw{2,1}=reshape(w2,Num_Out,Num_Hidden);

net.b{1}=reshape(B1,Num_Hidden,1);

net.b{2}=B2;


clc;

clear;

close all;

warning off;

addpath(genpath(pwd));

rng('default')



load data.mat

Num_In     = size(Train_data,1);

Num_Hidden = 6;

Num_Out    = 1;

%构建BP网络

net        = newff(Train_data,Train_aim,Num_Hidden);

net        = func_newGA(net,Num_In,Num_Hidden,Num_Out,Train_data,Train_aim);

net        = train(net,Train_data,Train_aim);

outputs    = round(sim(net,awgn(Test_data,0,'measured')));%测试的时候,加入随机干扰


%计算整体识别率

disp('整体识别率:');

C0 = 100*length(find(outputs==Test_aim))/length(Test_aim)

disp('第1种故障识别率:');

C1 = 100*length(find(outputs(1:50)==1))/length(Test_aim)*3

disp('第2种故障识别率:');

C2 = 100*length(find(outputs(51:100)==2))/length(Test_aim)*3

disp('第3种故障识别率:');

C3 = 100*length(find(outputs(101:150)==3))/length(Test_aim)*3



%测试不同噪声大小下的识别率

SNR = -2:1:16;

for i = 1:length(SNR)

i

for j = 1:20

rng(j);

Test_data2 = awgn(Test_data,SNR(i),'measured');

outputs    = round(sim(net,Test_data2));

C20(i,j)     = 100*length(find(outputs==Test_aim))/length(Test_aim);

C21(i,j)     = 100*length(find(outputs(1:50)==1))/length(Test_aim)*3;    

C22(i,j)     = 100*length(find(outputs(51:100)==2))/length(Test_aim)*3;    

C23(i,j)     = 100*length(find(outputs(101:150)==3))/length(Test_aim)*3;

end

end

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容