BP神经网络的结构可分成三部分:
- 输入层,输入数据;
- 隐藏层,处理数据;
- 输出层,输出结果。
其过程可以分为正向传播过程和反向传播过程,在正向传播过程中,BP神经网络通过隐层神经元对数据进行处理,从而输出相应结果,在反向传播过程中BP神经网络通过对比真实结果与预测结果之间的误差E来不断调整各层神经元的参数值,从而减小误差,达到理想的效果。调整的原则是是误差不断减小,因此应使权值调整量与误差梯度下降成正比。
单隐藏层神经网络:
计算方法:
其中f被称为激活函数,在单隐藏层神经网络中常用符号函数sgn()。
在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。
偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图。
考虑了偏置以后的神经网络的矩阵运算如下:
在两层神经网络中,我们不再使用sgn函数作为激活函数,而是使用平滑函数sigmoid作为激活函数
函数表达式:
S = 1/1+e^(-x)
多层神经网络:
增加更多层次的好处:
- 更深入的表示特征:网络层数增加,每一层对于前一层次的抽象表示更深入
- 更强的函数模拟能力:网络参数越多,意味着其模拟的函数可以更加复杂,可以有更多的容量拟合真正的关系
在多层神经网络中,我们通常使用ReLU函数 f(x) = max(0,x)作为激活函数
总结:
以下是使用matlab的神经网络工具箱进行的BP神经网络实现:
%% 此程序为matlab编程实现的BP神经网络
% 清空环境变量
clear
close all
clc
%%第一步 读取数据
input=randi([1 50],200,2); %载入输入数据
output=input(:,1)+input(:,2); %载入输出数据
%% 第二步 设置训练数据和预测数据
input_train = input(1:190,:)';
output_train =output(1:190,:)';
input_test = input(191:200,:)';
output_test =output(191:200,:)';
%节点个数
inputnum=2; % 输入层节点数量
hiddennum=5;% 隐含层节点数量
outputnum=1; % 输出层节点数量
%% 第三本 训练样本数据归一化
[inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(output_train);
%% 第四步 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值
W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值
%% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net.trainParam.lr=0.01; % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.00001
%% 第六步 BP神经网络训练
net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本
%% 第七步 测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化
%% 第八步 BP神经网络预测
an=sim(net,inputn_test); %用训练好的模型进行仿真
%% 第九步 预测结果反归一化与误差计算
test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级
error=test_simu-output_test; %预测值和真实值的误差
%%第十步 真实值与预测值误差比较
figure('units','normalized','position',[0.119 0.2 0.38 0.5])
plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('BP神经网络测试集的预测值与实际值对比图')
[c,l]=size(output_test);
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为: ',num2str(MSE1)])
disp(['均方根误差RMSE为: ',num2str(RMSE1)])
预测结果:
-----------------------误差计算--------------------------
隐含层节点数为5时的误差结果如下:
平均绝对误差MAE为:0.12181
均方误差MSE为: 0.02936
均方根误差RMSE为: 0.17135
文章参考: