MATLAB_第二篇神经网络学习_BP神经网络

非常感谢博主wishes61的分享。这篇博客只是为了记录下第一个神经网络的训练。

BP神经网络代码实现

    • 1. BP神经网络的简介和结构参数
      • 1.1 BP神经网络的结构组成
      • 1.2 神经元结构示意图
      • 1.3 BP神经网络训练界面的参数解读
    • 2. BP网络训练的步骤
    • 3. IRIS数据集
    • 4. MATLAB代码编写
    • 4. 运行结果
      • 4.1预测值,真实值,误差的分析图像
      • 4.2 预测值和真实值的误差计算(MAE,MSE,MRSE)

1. BP神经网络的简介和结构参数

  • 一种按照误差逆向传播算法训练的多层前馈神经网络用于预测BP神经网络的计算过程:由正向计算过程和反向计算过程组成。
  • 正向传播过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态。
  • 如果在输出层不能得到期望的输出,则转入反向传播,将误差信号沿原来的连接通路返回,通过修改各神经元的权值,使得误差信号最小值。

1.1 BP神经网络的结构组成

MATLAB_第二篇神经网络学习_BP神经网络_第1张图片
下图是训练神经网络时经常出现的一个界面,从这部分我们可以看到,这是一个2输入1输出,5个隐含层的BP网络,称为2-5-1网络结构

1.2 神经元结构示意图

MATLAB_第二篇神经网络学习_BP神经网络_第2张图片
MATLAB_第二篇神经网络学习_BP神经网络_第3张图片
MATLAB_第二篇神经网络学习_BP神经网络_第4张图片
MATLAB_第二篇神经网络学习_BP神经网络_第5张图片MATLAB_第二篇神经网络学习_BP神经网络_第6张图片

1.3 BP神经网络训练界面的参数解读

需要注意的是:

  • 泛化性: 表示BP神经网络在训练过程中,如果均方误差(MSE)连续6次不降反升,则网络停止训练
  • 误差精度: 关于mu参数含义的一种理解是,mu是误差精度参数,用于给神经网络的权重再加一个调制,这样可以避免在BP网络训练的过程中陷入局部最小值,mu的范围为0到1。
    MATLAB_第二篇神经网络学习_BP神经网络_第7张图片

2. BP网络训练的步骤

  • 读取数据
  • 设置训练数据和预测数据
  • 训练样本数据归一化
  • 构建BP神经网络 网络参数配置(训练次数,学习速率,训练目标最小误差.等)
  • BP神经网络训练
  • 测试样本归一化
  • BP神经网络预测
  • 预测结果反归一化与误差计算
  • 验证集的真实值与预测值误差比较

3. IRIS数据集

  • iris是鸢尾花数据集,是一类多重变量分析的数据集。
  • 数据集包含150个数据样本,分为3类,酶类50个数据,每个数据包含4个属性。
  • 可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
    数据下载链接:http://archive.ics.uci.edu/ml/index.php

4. MATLAB代码编写

% 清空环境变量
clc
clear all
% 1.导入数据
iris=load('iris.csv');
% 统计描述量
feature=iris(:,1:4);
mean=mean(feature); % 描述算法平均值
median=median(feature);% 描述元素的中位数
std=std(feature);%描述元素的标准差

% 2. 设置训练数据和预测数据
 %doc dividevec[分频器]:divid problem vectors into training,validation and test通过分频器得到的结果为三个struct。其中trainSamples中有90个样本(以列的形式呈现),此外trainSamples.P表示数据的特征;trainSamples.L表示90个样本对应的标签;trainSamples.indices表示90个样本在源数据中对应的位置。
normInput=iris(:,1:4)';
normTarget=iris(:,5)';
testPercent=0.20; %测试数据
validatePercent=0.20;%验证数据
[trainSamples,validateSamples,testSamples]=dividevec(normInput,normTarget,validatePercent,testPercent);

% 3. 训练样本数据归一化
[inputn,inputps]=mapminmax(trainSamples.P); % 归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(trainSamples.T);

% 4. 构建神经网络
% 节点个数
inputnum=2;
hiddenum=5;
% 隐含层节点数量经验公式p=sqrt(m+n)+a,故分别取2~13进行试验
outputnum=1;
% 构建BP神经网络
net=newff(inputn,outputn,hiddenum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
w1=net.iw{1,1} ;%输入层到中间层的权值
B1=net.b{1} ;% 中间各层神经元阈值
w2=net.lw{2,1} ;%中间层到输出层的权值
B2=net.b{2}; %输出层各神经元阈值

% 5. 网络参数配置(训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;% 学习速率,这里设置为0.01
net.trainParam.goal=0.00001; %训练目标最小误差,这里设置为0.00001

% 6. BP神经网络训练
net=train(net,inputn,outputn);% 开始训练,其中inputn,outputn分别是输入输出样本

% 7. 验证样本归一化
inputn_validation=mapminmax('apply',validateSamples.P,inputps);%对验证样本进行归一化

% 8. BP神经网络预测
an=sim(net,inputn_validation);% 用训练好的模型进行仿真

% 9. 预测结果反归一化与误差计算
validation_simu=mapminmax('reverse',an,outputps);% 把仿真结果得到的数据还原为原始的数量集
error=validation_simu-validateSamples.T;%预测值与真实值的误差

% 10. 真实值与预测值误差的比较
figure(1)
plot(validateSamples.T,'bo-')
hold on
plot(validation_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('值')
[c,l]=size(validateSamples.T);
MAE1=sum(abs(error./validateSamples.T))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(hiddenum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])

4. 运行结果

4.1预测值,真实值,误差的分析图像

MATLAB_第二篇神经网络学习_BP神经网络_第8张图片

4.2 预测值和真实值的误差计算(MAE,MSE,MRSE)

MATLAB_第二篇神经网络学习_BP神经网络_第9张图片
MATLAB_第二篇神经网络学习_BP神经网络_第10张图片
MATLAB_第二篇神经网络学习_BP神经网络_第11张图片
MATLAB_第二篇神经网络学习_BP神经网络_第12张图片

你可能感兴趣的:(MATLAB,神经网络)