遗传算法优化BP神经网络前后的对比

<注>遗传算法部分使用Sheffield工具箱,BP部分是MATLAB自带。

1.BP代码实现

function err = Bpfun(x,P,T,hiddennum,p_test,T_test)

%    x为个体初始权值&阈值
%    P为训练样本输入
%    T为训练样本输出
%    hiddennum为隐含层神经元数量
%    P_test为测试样本输入
%    T_test为测试样本输出

%    err为预测样本误差

inputnum = size(P,1)    %输入层神经元个数
outputnum = size(T,1)    %输出层神经元个数

%    开始构建网络
net = feedforwardnet(hiddennum);
net = configure(net,P,T);
net.layers{2}.transferFcn = 'longsig';

%设置参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
net.trainParam.show = NaN;
w1num = inputnum * hiddennum;    %输入层到隐含层
w2num = outputnum * hiddennum;    %隐含层到输出层
w1 = x(1:w1num)    %输入层到隐含层权值
B1 = x(w1num + 1:w1num + hiddennum);    %隐含层神经元阈值
w2 = x(w1num + hiddennum+ 1:w1num + hiddennum + w2num);    %隐含层到输出层权值
B2 = x(w1num + hiddennum+ + w2num + 1:w1num + hiddennum + w2num + 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} = reshape(B2,outputnum,1);

%训练
net = train(net,P,T);

%测试
Y = sim(net,P_test);
err = norm(Y-T_test);


自认为注释写得还比较清楚哈哈哈,csdn上好多大佬讲BP还是很清楚的,我也看了好多才搞懂,大家可以去学习一下。

之后就是写遗传算法的主程序,然后两者对比。

用遗传算法进行BP优化还是很简单的,就是在BP输出误差后计算适应度,然后进行交叉变异等操作,检验是否满足终止条件。

画个简单的图就是:

                                                               

2. 遗传算法主函数就很简单,之前写过,不嫌弃的可以看一下:https://blog.csdn.net/zhangqimo/article/details/105353906

clc
clear

load data 

hiddennum = 31;    %设置隐含层神经元个数
threshold = [0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
inputnum = size(P,1);    %输入层神经元个数
outputnum = size(T,1);    %输出层神经元个数
w1num = inputnum * hiddennum;    %输入层到隐含层权值数
w2num = outputnum * hiddennum;    %隐含层到输出层权值数
N = w1num + hiddennum + w2num +outputnum;    %变量数

%设置参数
NIND = 40;    %种群大小
MAXGEN = 50;    %最大遗传代数
PRECI = 10;    %个体长度
GGAP = 0.95;    %代沟
px = 0.7;    %交叉概率
pm = 0.01;    %变异概率
trace = zeros(N+1,MAXGEN);    %寻优结果的初始值

FieldD = [repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];    %描述区域
Chrom = crtbp(NIND,PRECI * N);

%优化
gen = 0;    %计数器
X = bs2rv(Chrom,FieldD);    %种群的十进制转化
ObjV = Objfun(X,P,T,hiddennum,P_test,T_test);    
while gen<MAXGEN
    fprint('%d\n',gen)
    FitnV = ranking(ObjV);    %分配适应度
    Selch = select('sus',Chrom,FitnV,GGAP);    %选择
    Selch = recombin('xovsp',SelCh,px);    %重组
    Selch = mut(Selch,pm);    %变异
    X = bs2rv(Selch,FieldD);    %把子代的二进制转化为十进制
    ObjVSel = Objfun(X,P,T,hiddennum,P_test,T_test);    %子代和父代再次计算
    X = bs2rv(Chrom,FieldD);
    gen = gen + 1;
    
[Y,I] = min(ObjV);    %Y为最优解,I为个体序号
trace(1:N,gen) = X(I,:);    %记录每代最优
trace(end,gen) = Y;
end
bestX = trace(1:end-1,end);
bestErr = trace(end,end);

这里面涉及到一个Objfun的函数,定义为求解种群中各个个体的目标值

function Obj = Objfun(X,P,T,hiddennum,P_test,T_test)

[M,N] = size(X);
Obj = zeros(M,1);
for i = 1:M
    Obj(i) = Bpfun(X(i,:),P,T,hiddennum,P_test,T_test);
end

3. 进行比较

clc
inputnum = size(P,1)    %输入层神经元个数
outputnum = size(T,1)    %输出层神经元个数

%    开始构建网络
net = feedforwardnet(hiddennum);
net = configure(net,P,T);
net.layers{2}.transferFcn = 'longsig';

%设置参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
%训练
net = train(net,P,T);

%测试
disp(['1.使用随机权值和阈值'])
disp(['测试样本预测结果'])
Y1 = sim(net,P_test);
err1 = norm(Y-T_test);
err11 = norm(sim(net,P)-T);
disp(['测试样本的仿真误差',num2str(err1)])
disp(['训练样本的仿真误差'],num2str(err11))

%优化后的权值阈值
inputnum = size(P,1)    %输入层神经元个数
outputnum = size(T,1)    %输出层神经元个数

%    开始构建网络
net = feedforwardnet(hiddennum);
net = configure(net,P,T);
net.layers{2}.transferFcn = 'longsig';

%设置参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
w1num = inputnum * hiddennum;    %输入层到隐含层
w2num = outputnum * hiddennum;    %隐含层到输出层
w1 = x(1:w1num)    %输入层到隐含层权值
B1 = x(w1num + 1:w1num + hiddennum);    %隐含层神经元阈值
w2 = x(w1num + hiddennum+ 1:w1num + hiddennum + w2num);    %隐含层到输出层权值
B2 = x(w1num + hiddennum+ + w2num + 1:w1num + hiddennum + w2num + 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} = reshape(B2,outputnum,1);

%训练
net = train(net,P,T);

%测试
disp(['2.使用优化权值和阈值'])
disp(['测试样本预测结果'])
Y2 = sim(net,P_test);
err2 = norm(Y2-T_test);
err21 = norm(sim(net,P)-T);
disp(['测试样本的仿真误差',num2str(err2)])
disp(['训练样本的仿真误差'],num2str(err21))

以上,对比试验基本上就是把上面两者重复一遍,在遗传算法后得到最佳的初始权值与阈值矩阵,通过画图或是比较误差即可得到两者差别。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值