BP神经网络原理及在Matlab中的应用
一、人工神经网络
关于对神经网络的介绍和应用,请看如下文章
神经网络潜讲
如何简单形象又有趣地讲解神经网络是什么
二、人工神经网络分类
按照连接方式——前向神经网络、反馈(递归)神经网络
按照学习方式——有导师学习神经网络、无导师学习神经网络
- 按照实现功能——拟合(回归)神经网络、分类神经网络
三、BP神经网络概述
1. 特点
- BP神经网络中 BP 是指 BackPropagation (反向传播) ,指的是误差的反向传播 ,其信号是向前传播的 , 从结构上分类 ,它是前向有导师学习神经网络 ,BP神经网络要求激活函数必须是可微分的函数。
2. 学习算法
(1) 传播阶段
首先是信号传播
其次是误差的反向传播
将误差按照信号的反方向传播,结果的误差由权值设置不合理造成,这个步骤用来保证输出结果的正确性。
(2) 权值更新阶段
- 梯度下降法——利用梯度下降最快的方向进行权值修正
3. 举例
图中是一个简单的神经网络,可以计算出
y1=f1(w1x1+w3x2) y 1 = f 1 ( w 1 x 1 + w 3 x 2 ) , y2=f2(w2x1+w4x2+w5x3) y 2 = f 2 ( w 2 x 1 + w 4 x 2 + w 5 x 3 ) , y3=f3(w6x3) y 3 = f 3 ( w 6 x 3 ) , y4=f4(w11y1+w21y2+w31y3) y 4 = f 4 ( w 11 y 1 + w 21 y 2 + w 31 y 3 ) , y5=f5(w32y3) y 5 = f 5 ( w 32 y 3 ) 。 最终输出为 y=f(w41y4+w51y5) y = f ( w 41 y 4 + w 51 y 5 ) 。假设预期结果为 z z 。
可以将最终结果与预期结果
因此可以得到 w1′=w1+ηδ1df1(e)dex1 w 1 ′ = w 1 + η δ 1 d f 1 ( e ) d e x 1 , e e 为 输入参数,其他权值修改同理。
四、数据归一化
- 什么是数据归一化
- 将数据映射到 [0,-1] 或 [-1,1] 区间或其他区间
- 为什么要数据归一化
- 输入数据的单位不一样,有些数据的范围很大,导致的结果是神经网络收敛慢、训练时间长。
- 数据范围大的输入在模式分类中的作用可能会偏大,数据范围小的输入在模式分类中的作用可能会偏小
- 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。
- 某些激活函数在 (0,1) 外很平缓,区分度很小。
- 归一化算法
y = ( x − m i n ) / ( m a x − m i n ) ​ " role="presentation">- y=2∗(x−min)/(max−min)−1 y = 2 ∗ ( x − m i n ) / ( m a x − m i n ) − 1
五、函数介绍
- 归一化函数——mapminmax()
- [Y,PS] = mapminmax(X,YMIN,YMAX),X是预处理的数据,Ymin和Ymax是期望的每一行的最小值与最大值,Y是规范化得到的数据,这种规范化的映射记录在 PS 中。
- Y = mapminmax(‘apply’,X,PS),这种方法一般是用在上一条语句之后,用上一条语句得到的 PS ,可以使得这里要处理的数据的规范化规则和上一条是一样的。
- X = mapminmax(‘reverse’,Y,PS) ,预处理之后的数据进行反转得到原始数据 。
- 创建前向神经网络——newff()
- net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
- P :输入参数矩阵。
- T :目标参数矩阵。
- S :N-1个隐含层的数目(S(i)到S(N-1)),默认为空矩阵[] 。
- TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。此外还有 purelin: 线性传递函数。 tansig :正切S型传递函数。logsig :对数S型传递函数。
- BTF:BP神经网络学习训练函数,默认值为trainlm函数 。此外还有 traingd:最速下降BP算法。traingdm:动量BP算法。trainda:学习率可变的最速下降BP算法。traindx:学习率可变的动量BP算法。trainrp:弹性算法。变梯度算法:traincgf(Fletcher-Reeves修正算法)traincgp(Polak_Ribiere修正算法)traincgb(Powell-Beale复位算法)trainbfg(BFGS 拟牛顿算法)trainoss(OSS算法)。
- BLF:权重学习函数,默认值为learngdm。PF:性能函数,默认值为mse,可选择的还有sse,sae,mae,crossentropy。
- IPF,OPF,DDF均为默认值即可。
- 训练函数——train()
- [net,tr,Y,E,Pf,Af] = train(net,P,T,Pi,Ai)
- net:神经网络
- P : 神经网络输入
- T:神经网络目标(可选,有或无)
- Pi:初始输入延迟条件(默认为0)
- Ai:初始层延迟条件(默认为0)
- 返回值 net :新的训练过的网络
- 返回值 tr :训练记录
- 仿真,模拟,预测——sim()
- [Y,Pf,Af,E,perf] = sim(net,P,Pi,Ai,T)
- Y:输出
- Pf:最终输出延迟
- Af:最终层延迟
- E:误差向量
- perf:平均绝对误差(网络性能)
- P:输入
- Pi:初始输入延迟,默认为0
- Ai:初始层延迟,默认为0
- T:神经网络目标
六、具体实例
问题描述
解题思路
- 代码
%% I. 清空环境变量
clear all
clc%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat%%
% 2. 随机产生训练集和测试集,因为是随机产生,所以每次执行的结果会不同
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)’;
T_train = octane(temp(1:50),:)’;
% 测试集——10个样本
P_test = NIR(temp(51:end),:)’;
T_test = octane(temp(51:end),:)’;
N = size(P_test,2);%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax(‘apply’,P_test,ps_input);[t_train, ps_output] = mapminmax(T_train,0,1);
%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,9);%%
% 2. 设置训练参数
net.trainParam.epochs = 1000; %迭代次数
net.trainParam.goal = 1e-3; %训练目标,误差范围
net.trainParam.lr = 0.01; %学习率%%
% 3. 训练网络
net = train(net,p_train,t_train);%%
% 4. 仿真测试
t_sim = sim(net,p_test);%%
% 5. 数据反归一化
T_sim = mapminmax(‘reverse’,t_sim,ps_output);%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));%%
% 3. 结果对比
result = [T_test’ T_sim’ error’]%% VI. 绘图
figure
plot(1:N,T_test,’b:*’,1:N,T_sim,’r-o’)
legend(‘真实值’,’预测值’)
xlabel(‘预测样本’)
ylabel(‘辛烷值’)
string = {‘测试集辛烷值含量预测结果对比’;[‘R^2=’ num2str(R2)]}; %越接近1,效果越好
title(string)执行结果
参数对BP神经网络影响
- 隐含层神经元节点个数
- 激活函数类型的选择
- 学习率
- 初始权值与阈值
- 交叉验证
- 留一法
七、源码及数据下载
链接: 密码:ebih
- 归一化函数——mapminmax()
BP神经网络原理及在Matlab中的应用
一、人工神经网络
关于对神经网络的介绍和应用,请看如下文章
神经网络潜讲
如何简单形象又有趣地讲解神经网络是什么
二、人工神经网络分类
按照连接方式——前向神经网络、反馈(递归)神经网络
按照学习方式——有导师学习神经网络、无导师学习神经网络
- 按照实现功能——拟合(回归)神经网络、分类神经网络
三、BP神经网络概述
1. 特点
- BP神经网络中 BP 是指 BackPropagation (反向传播) ,指的是误差的反向传播 ,其信号是向前传播的 , 从结构上分类 ,它是前向有导师学习神经网络 ,BP神经网络要求激活函数必须是可微分的函数。
2. 学习算法
(1) 传播阶段
首先是信号传播
其次是误差的反向传播
将误差按照信号的反方向传播,结果的误差由权值设置不合理造成,这个步骤用来保证输出结果的正确性。
(2) 权值更新阶段
- 梯度下降法——利用梯度下降最快的方向进行权值修正
3. 举例
图中是一个简单的神经网络,可以计算出
y1=f1(w1x1+w3x2) y 1 = f 1 ( w 1 x 1 + w 3 x 2 ) , y2=f2(w2x1+w4x2+w5x3) y 2 = f 2 ( w 2 x 1 + w 4 x 2 + w 5 x 3 ) , y3=f3(w6x3) y 3 = f 3 ( w 6 x 3 ) , y4=f4(w11y1+w21y2+w31y3) y 4 = f 4 ( w 11 y 1 + w 21 y 2 + w 31 y 3 ) , y5=f5(w32y3) y 5 = f 5 ( w 32 y 3 ) 。 最终输出为 y=f(w41y4+w51y5) y = f ( w 41 y 4 + w 51 y 5 ) 。假设预期结果为 z z 。
可以将最终结果与预期结果
z " role="presentation"> 作对比,得到误差值 δ δ , 从而得到δ 4 = w 41 " role="presentation"> , δ5=w51δ δ 5 = w 51 δ , δ1=w11δ4 δ 1 = w 11 δ 4 , δ2=w21δ4 δ 2 = w 21 δ 4 , δ3=w31δ4+w32δ5 δ 3 = w 31 δ 4 + w 32 δ 5 。δ 因此可以得到 w1′=w1+ηδ1df1(e)dex1 w 1 ′ = w 1 + η δ 1 d f 1 ( e ) d e x 1 , e e 为 输入参数,其他权值修改同理。
四、数据归一化
- 什么是数据归一化
- 将数据映射到 [0,-1] 或 [-1,1] 区间或其他区间
- 为什么要数据归一化
- 输入数据的单位不一样,有些数据的范围很大,导致的结果是神经网络收敛慢、训练时间长。
- 数据范围大的输入在模式分类中的作用可能会偏大,数据范围小的输入在模式分类中的作用可能会偏小
- 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。
- 某些激活函数在 (0,1) 外很平缓,区分度很小。
- 归一化算法
y = ( x − m i n ) / ( m a x − m i n ) ​ " role="presentation">- y=2∗(x−min)/(max−min)−1 y = 2 ∗ ( x − m i n ) / ( m a x − m i n ) − 1
五、函数介绍
- 归一化函数——mapminmax()
- [Y,PS] = mapminmax(X,YMIN,YMAX),X是预处理的数据,Ymin和Ymax是期望的每一行的最小值与最大值,Y是规范化得到的数据,这种规范化的映射记录在 PS 中。
- Y = mapminmax(‘apply’,X,PS),这种方法一般是用在上一条语句之后,用上一条语句得到的 PS ,可以使得这里要处理的数据的规范化规则和上一条是一样的。
- X = mapminmax(‘reverse’,Y,PS) ,预处理之后的数据进行反转得到原始数据 。
- 创建前向神经网络——newff()
- net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
- P :输入参数矩阵。
- T :目标参数矩阵。
- S :N-1个隐含层的数目(S(i)到S(N-1)),默认为空矩阵[] 。
- TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。此外还有 purelin: 线性传递函数。 tansig :正切S型传递函数。logsig :对数S型传递函数。
- BTF:BP神经网络学习训练函数,默认值为trainlm函数 。此外还有 traingd:最速下降BP算法。traingdm:动量BP算法。trainda:学习率可变的最速下降BP算法。traindx:学习率可变的动量BP算法。trainrp:弹性算法。变梯度算法:traincgf(Fletcher-Reeves修正算法)traincgp(Polak_Ribiere修正算法)traincgb(Powell-Beale复位算法)trainbfg(BFGS 拟牛顿算法)trainoss(OSS算法)。
- BLF:权重学习函数,默认值为learngdm。PF:性能函数,默认值为mse,可选择的还有sse,sae,mae,crossentropy。
- IPF,OPF,DDF均为默认值即可。
- 训练函数——train()
- [net,tr,Y,E,Pf,Af] = train(net,P,T,Pi,Ai)
- net:神经网络
- P : 神经网络输入
- T:神经网络目标(可选,有或无)
- Pi:初始输入延迟条件(默认为0)
- Ai:初始层延迟条件(默认为0)
- 返回值 net :新的训练过的网络
- 返回值 tr :训练记录
- 仿真,模拟,预测——sim()
- [Y,Pf,Af,E,perf] = sim(net,P,Pi,Ai,T)
- Y:输出
- Pf:最终输出延迟
- Af:最终层延迟
- E:误差向量
- perf:平均绝对误差(网络性能)
- P:输入
- Pi:初始输入延迟,默认为0
- Ai:初始层延迟,默认为0
- T:神经网络目标
六、具体实例
问题描述
解题思路
- 代码
%% I. 清空环境变量
clear all
clc%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat%%
% 2. 随机产生训练集和测试集,因为是随机产生,所以每次执行的结果会不同
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)’;
T_train = octane(temp(1:50),:)’;
% 测试集——10个样本
P_test = NIR(temp(51:end),:)’;
T_test = octane(temp(51:end),:)’;
N = size(P_test,2);%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax(‘apply’,P_test,ps_input);[t_train, ps_output] = mapminmax(T_train,0,1);
%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,9);%%
% 2. 设置训练参数
net.trainParam.epochs = 1000; %迭代次数
net.trainParam.goal = 1e-3; %训练目标,误差范围
net.trainParam.lr = 0.01; %学习率%%
% 3. 训练网络
net = train(net,p_train,t_train);%%
% 4. 仿真测试
t_sim = sim(net,p_test);%%
% 5. 数据反归一化
T_sim = mapminmax(‘reverse’,t_sim,ps_output);%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));%%
% 3. 结果对比
result = [T_test’ T_sim’ error’]%% VI. 绘图
figure
plot(1:N,T_test,’b:*’,1:N,T_sim,’r-o’)
legend(‘真实值’,’预测值’)
xlabel(‘预测样本’)
ylabel(‘辛烷值’)
string = {‘测试集辛烷值含量预测结果对比’;[‘R^2=’ num2str(R2)]}; %越接近1,效果越好
title(string)执行结果
参数对BP神经网络影响
- 隐含层神经元节点个数
- 激活函数类型的选择
- 学习率
- 初始权值与阈值
- 交叉验证
- 留一法
七、源码及数据下载
链接: 密码:ebih
- 归一化函数——mapminmax()