标准BP神经网络以及MATLAB实现

BP神经网络的结构可分成三部分:

  • 输入层,输入数据;
  • 隐藏层,处理数据;
  • 输出层,输出结果。

        其过程可以分为正向传播过程和反向传播过程,在正向传播过程中,BP神经网络通过隐层神经元对数据进行处理,从而输出相应结果,在反向传播过程中BP神经网络通过对比真实结果与预测结果之间的误差E来不断调整各层神经元的参数值,从而减小误差,达到理想的效果。调整的原则是是误差不断减小,因此应使权值调整量与误差梯度下降成正比。

单隐藏层神经网络:

计算方法:

 z={sgn(a1w1+a2w2+a3w3)}

       其中f被称为激活函数,在单隐藏层神经网络中常用符号函数sgn()

        在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。

  偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图。

 考虑了偏置以后的神经网络的矩阵运算如下:


g(W(1)*a(1)+b(1))=a(2)

g(W(2)*a(2)+b(2))=z

两层神经网络中,我们不再使用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

文章参考:

BP神经网络预测matlab代码讲解与实现步骤_CJ-leaf的博客-CSDN博客_bp神经网络matlab代码

神经网络——最易懂最清晰的一篇文章_illikang的博客-CSDN博客_神经网络

猜你喜欢

转载自blog.csdn.net/qq_54543084/article/details/128250379