BP-network
BP网络是前向神经网络中最核心的部分,但是存在一些缺陷,学习收敛速度较慢,不能保证收敛到全局最小点,网络结构不确定等。
GA优化BP思路
主要部分为:BP神经网络确定,GA优化权值和阈值,BP进行训练&预测
BP创建
BP创建一般遵循以下原则
- 对于一般的模式识别问题,三层网络即可适用
- 三层网络中,隐藏层神经元个数
n
2
n_2
n2和输入层神经元个数
n
1
n_1
n1具有如下近似关系:
n 2 = 2 × n 1 + 1 n_2=2\times n_1+1 n2=2×n1+1 - 泛化能力的设置:将测试样本的测试误差的范数作为衡量网络的一个泛化能力的标准,通过该误差计算个体适应度值,个体误差范数越小,个体适应度值越大
激活函数设置
隐藏层的传递函数使用S
型tansig
,输出层神经元的传递函数使用S
型对数函数logsig()
GA
种群初始化
使用二进制编码,由输入层与隐藏层链接权值,隐藏层权值,隐藏层与输出层权值,输出层权值四部分组成,每个权值和阈值使用M
位的二进制编码,将所有权值和阈值编码链接为一个个体编码。
适应度函数
采用预测样本的预测值与期望值的误差矩阵的范数作为目标函数的输出,适应度函数采用排序的适应度配分函数
F
i
t
n
V
=
r
a
n
k
i
n
g
(
o
b
j
)
FitnV=ranking(obj)
FitnV=ranking(obj)
其中obj
为目标函数的输出
选择算子
选择算子使用随机遍历抽样(sus
)
交叉算子
使用简单的单点交叉算子
变异算子
变异以一定概率产生变异基因数,使用随机方法选择出变异的基因,如果所选择基因的编码为1则转为0,反之则转为1.
Code
%% BP network (未经过GA优化版本)
% # of hidden layers: 31
net = feedforwardnet(31);
net.layers{2}.transferFcn='logsig';
% set training parameters
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
% train & test network
net = train(net, P, T);
Y = sim(net, P_test);
%% GA-BP
clc;
clear all;
close all;
load data;
nHidden = 31;
% max/min value of input vector 输入向量
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];
nInput = size(P, 1); % 输入层的神经元的个数
nOutput = size(T, 1); % 隐含层的神经元的个数
w1num = nInput*nHidden; % 输入层到隐藏层的权值个数
w2num = nOutput*nHidden; % 隐藏层到输出层的权值个数
N = w1num+nHidden+w2num+nOutput; % 待优化变量的数量
% GA参数
NIND = 40; % 种群大小
MAXGEN = 50; % 最大遗传代数
PRECI = 10; % 个体长度
GGAP = 0.95; % 代沟
px = 0.7; % 排序
pm = 0.1; % 变异概率
trace = zeros(N+1, MAXGEN); % 寻优结果
FieldD = [repmat(PRECI, 1, N); repmat([-0.5; 0.5], 1, N); repmat([1; 0; 1; 1], 1, N)]; % 区域描述器, Matrix describing the length and how to decode each substring in the chromsome.
Chrom = crtbp(NIND, PRECI*N); % 创建初始种群
gen = 0;
X = bs2rv(Chrom, FieldD); % 初始种群的十进制转换
ObjV = Objfunc(X, P, T, nHidden, P_test, T_test);
while gen<MAXGEN
fprintf('Generation: %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 = Objfunc(X, P, T, nHidden, P_test, T_test); % 子代目标函数值
[Chrom, ObjV] = reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); % 将子代重插入到父代中,得到新的种群
gen = gen+1;
% 获取每代的最优解(Y)以及序号(I)
[Y, I] = min(ObjV);
trace(1:N, gen) = X(I, :);
trace(end, gen)=Y;
end
%% plot evolutionary figure
figure(1);
plot(1:MAXGEN, trace(end, :));
grid on;
xlabel('Generations of GA');
ylabel('Error');
title('Process of evolutionary');
% output optimized information
bestX = trace(1:end-1, end);
bestErr = trace(end, end);
%fprintf('Optimal initial weights and threshold:\nX= ', num2str(bestX'));
fprintf('Minimum Error = %d\n', num2str(bestErr));
GA对比
clc;
%% 对比使用GA前后的差别
%% 使用随机权重和阈值
nInput = size(P, 1); % 输入层神经元的个数
nOutput = size(T, 1); % 输出层神经元的个数
% BP
net = feedforwardnet(nHidden);
net = configure(net, P, T); % 配置训练集数据
net.layers{2}.transferFcn = 'logsig';
% 设置网络参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
net.trainParam.showWindow = false;
% 训练网络
net = train(net, P, T);
disp(['1. 使用随机权值和阈值']);
Y1 = sim(net, P_test)
err1 = norm(Y1-T_test); % 测试样本的仿真误差
err11 = norm(sim(net, P)-T); % 训练样本的仿真误差
fprintf('Test samples error = %.4f\n', err1);
fprintf('Train samples error = %.4f\n', err11);
%% 优化参数
% BP
net = feedforwardnet(nHidden);
net = configure(net, P, T); % 配置训练集数据
net.layers{2}.transferFcn = 'logsig';
% 设置网络参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
net.trainParam.showWindow = false;
w1num = nInput*nHidden;
w2num = nOutput*nHidden;
w1 = bestX(1:w1num);
B1 = bestX(w1num+1:w1num+nHidden);
w2 = bestX(w1num+nHidden+1: w1num+nHidden+w2num);
B2 = bestX(w1num+nHidden+w2num+1: w1num+nHidden+w2num+nOutput);
net.iw{1, 1}=reshape(w1, nHidden, nInput);
net.lw{2, 1}=reshape(w2, nOutput, nHidden);
net.b{1}=reshape(B1, nHidden, 1);
net.b{2} = reshape(B2, nOutput, 1);
% train
net = train(net, P, T);
disp(['2. 使用优化后的权值和阈值']);
Y2 = sim(net, P_test)
err2 = norm(Y2-T_test);
err21 = norm(sim(net, P)-T);
fprintf('Test samples error = %.4f\n', err2);
fprintf('Train samples error = %.4f\n', err21);
Reference
Matlab智能算法