菜鸟学matlab之智能算法(2)——————————BP神经网络算法

一.算法背景和理论

BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。

二.算法的详细分析

《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》
图2.1BP神经元的简略图

关于图的分析(五种元素):
      1)输入信号(也就是我们的输入向量)
      2)连接权(通常也用向量来表示):连接强度由各自连接上的权值表示(正负都可以),其中正表示激活,负表示抑制。
      3)加法器:用来求所有输入信号及其对应的权值积的和。
      4)激活函数:用来抑制输出信号的振幅(这个下文会有详解),激活函数也可以被称为抑制函数,因为它将输出信号限制在允许范围的一个定值。通常,一个输出信号的正常幅度范围可 写成单位闭区间的[0,1],或者另一种区间[-1,1]。
      5)偏置阙值(可要可不要):在BP神经网络中,阈值也是一个变化值。根据其为正或者为负,相应的增加或者减少激活函数的网格输入。具体可以用下面的公式表示(其中bk表示自行设定的阙值大小):
     ![这里写图片描述](https://img-blog.csdn.net/20150907001635630) 

  通过训练网络(下面会详解),对权重和阈值进行修正,最终达到局部最优。
—————————————————————————————
三.BP神经网络中各个元素的详解及扩展
1)激活函数的种类
激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。
(1) 线性函数 ( Liner Function )
《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》
该函数在变量位于(-1,1)之间时放大的系数是一致的。
(2) 斜面函数 ( Ramp Function )

(3) 域值函数 ( Threshold Function )
《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

当输入变量大于等于0时,输出函数值为1,当小于0时,输出为0.

以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数(最常用)。
说明:所有的非线性都为实数域R到[0,1]闭集的非连接函数,代表了状态连续型神经元模型。最常用的的非线性转移函数是单极性的Sigmoid函数曲线,简称S型函数,其特点是函数本身及其导数都是连续的,能够体现数学计算上的优越性,因而在处理上十分方便。具体定义如下
(4)S形函数 ( Sigmoid Function )
《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

 图像:《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

(5) 双极S形函数 (取值范围[-1,1])
《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

四.具体的神经网络模型

分类标准:将一个神经元的输出送到另一个神经元作为输入信号称之为连接,每个连接通路对应一个连接权系数,相同神经元经过不同的连接方式将得到不同特性的神经网络(一般可分为分层网络和相互连接型网络)

1.分层网络

定义:将模型中的所有神经元按照功能分成若干层。一般有输入层.隐含层(中间型)和输出层,各层次相互连接。

输入层连接外部输入模式,并由各输入单元传送给项链的隐含层各单元;隐含层是模型的内部处理(这个也是理解了很久,并和最终输出信号的精度有关。)单元层,神经网络所具有的模式变换能力,如模式完善.特征抽取等,主要体现在隐含层单元的处理,根据模式变换功能的不同,隐含层可以有多层,也可以一层都没有;输出才能产生神经网络的输出模式。

分层网络可以细分为三种(根据内部的互联方式)
1)单纯的前向行网络(见图a)

《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

结构分析:输入模式有输入才能进入网络,经过中间各层顺序(一直向前无反馈)模式,由输出层产生一个输出模式,并完成一次网络状态的更新。

2)具有反馈的前向型网络(见图b)

《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

结构分析:反馈结构形式的封闭环路,具有反馈的单元也成为隐单元,其输出成为内部输出,而网络本身还是前向型的。

3)层内互联的前向型网络(见图C)

《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

结构分析:同一层内单元的相互连接使它们彼此之间制约。限制同一层内能同时激活的单元个数,从外部看来还是前向型网络。一些自组织竞争网络就采用这种拓扑结构。

2.互相连接型网络(见图d)

定义:网络中任一两个单元之间都可达到,即存在连接路径。互联网络又分为局部互联和全互联。全互联中的每个神经元的输出都与其他神经元项链,而局部互联网络中,有些神经元直接没有连接关系。
《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

异同比较:对于简单的前向型网络,给定某一输入模式,网络能迅速产生一个相应的输出模式,由某一网络参数出发,在一定时间内处于不但改变输出模式的动态变化中,网络最终肯呢个产生某一稳定的输出模式,但也可能进入周期性震荡或混沌状态。

2.神经网络的学习方式
怎么理解学习呢,神经网络需要提前给定样本(包括输入信号和输出信号),学习也可以称之为“训练”,指的是神经网络在外部环境的刺激下调整参数,使整个模型以一种全新的方式对外部环境做出反应的一个过程。
根据学习环境不同,神经网络的学习方式可分为监督学习和非监督学习。

1)监督学习:将训练样本的数据加到网络输入端,同时将相应的期望输出和网格输出相比较,得到误差信号,以此来控制权值连接强度的调整,经多次训练后收敛到一个确定的权值当样本情况发生变化时,经学习可以修改权值以适应新的环境。
—————————————————————————————

总结:整个算法流程图

《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

五.matlab代码案例

1)`

 p=-1:0.1:1;%表示输入信号
T=[-0.96 -0.577 -0.0729 0.377 0.641 0.66 0.461 0.1336 -0.201 -0.434 -0.5 -0.393 -0.1647 0.0988 0.3072 0.396 0.3449 0.1816 -0.0312 -0.2183 -0.3201];%表示输出信号,当做训练的样本,需要特别注意的是输出样本的维数必须要和输入相同
 net =newff([-1,1],[5,1],{'tansig','purelin'});%[-1,1]表示输入信号的范围(输入信号通常会在之前做归一化处理,下面的例子会有细讲),[5,1]表示隐含层有五个神经元,输出层有一个神经元。'tansig'表示隐含层的传递函数为transig(单极性非线性函数),输出层的传递函数为purelin。
 net.trainParam.epochs=200;%最大的训练次数
 net.trainParam.goal=0;%训练目标,也就是误差精度
 net.trainParam.show=50;%两次显示之间的训练次数
 net=train(net,p,T);%train为网络训练函数,创建最初的训练网络
Y=sim(net,p);%sim为神经网络预测函数,将训练好的函数仿真输出
 plot(p,T,'-',p,Y,'o');`

得出的函数图像如下所示:
《菜鸟学matlab之智能算法(2)——————————BP神经网络算法》

注:以上代码来自《数学建模与数学实验》第四版

2)

%以下布步骤为通过前1000组数据来建立BP神经网络
 inputs = xlsread("相对地址");%表示输入信号
targets = xlsread("相对地址");;%表示输出信号,当做训练的样本
 hiddenLayerSize = 9;%隐含节点的个数
net = patternnet(hiddenLayerSize);%用patternnet()函数,patternnet()函数的参数有 (hiddenSizes,trainFcn,performFcn)三个。hiddenSizes默认值是10,可以用数组表示多个隐含层。trainFcn默认值是 'trainscg'表示单极性方程, Performance function默认值是 'crossentropy'。如果想要有两个隐含层,每层的神经元都是10个,则可以写成 net = patternnet([10,10]);
 % 对数据进行预处理,这里使用了归一化函数(一般不用修改)
 %数据的归一化处理是指将数据统一规划在[0,1]之间,具体公式为
% y = (ymax - ymin)*(x - xmin)/(xmax - xmin) + ymin,可以用mapmaxmin()函数来进行处理
% For a list of all processing functions type: help nnprocess
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.outputs{2}.processFcns = {'removeconstantrows','mapminmax'};
 % 把训练数据分成三部分,训练网络、验证网络、测试网络

net.divideFcn = 'dividerand';  % Divide data randomly
net.divideMode = 'sample';  % Divide up every sample
net.divideParam.trainRatio =700/1000;%假设有1000条数据,前700条当做训练样本,验证网络和测试网络分别选择150条
net.divideParam.valRatio = 150/1000;
net.divideParam.testRatio = 150/1000;
 % 训练函数
% For a list of all training functions type: help nntrain
net.trainFcn = 'trainlm';  % Levenberg-Marquardt

% 使用均方误差来评估网络
% For a list of all performance functions type: help nnperformance
net.performFcn = 'mse';  % mse表示均方误差函数
% 画图函数
% For a list of all plot functions type: help nnplot
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
  'plotregression', 'plotfit'};
% 开始训练网络(包含了训练和验证的过程)
[net,tr] = train(net,inputs,targets);
% 测试网络
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% 获得训练、验证和测试的结果
trainTargets = targets .* tr.trainMask{1};
valTargets = targets  .* tr.valMask{1};
testTargets = targets  .* tr.testMask{1};
trainPerformance = perform(net,trainTargets,outputs)
valPerformance = perform(net,valTargets,outputs)
testPerformance = perform(net,testTargets,outputs)

% 可以查看网络的各个参数
view(net)

% 根据画图的结果,决定是否满意
% Uncomment these lines to enable various plots.
figure, plotperform(tr)
figure, plottrainstate(tr)
figure, plotconfusion(targets,outputs)
figure, ploterrhist(errors)
 save('training_net.mat','net','tr');
 load 'training_net.mat'
new_input = ex;
 new_output = round(net(ex'));
 new_input = ex;
 new_output = round(net(ex'));
new_output=new_ouput'
    原文作者:神经网络算法
    原文地址: https://blog.csdn.net/ibelievefly/article/details/48254151
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞