精华内容
下载资源
问答
  • Bp人工智能神经网络算法是广泛应用的算法,本资源采用C语言编写了BP人工神经网络实现代码,可以应用于各种人工智能神经网络开发中。
  • 人工神经网络算法实例
  • BP神经网络的Matlab实现——人工智能算法

    万次阅读 多人点赞 2018-01-27 23:07:23
    这几天在各大媒体上接触到了人工智能机器学习,觉得很有意思,于是开始入门最简单的机器算法——神经网络训练算法(Neural...在遗传算法、神经网络算法的学习入门之后觉得数学只要用心看没问题的(即使是蒙特卡洛和马尔

    这几天在各大媒体上接触到了人工智能机器学习,觉得很有意思,于是开始入门最简单的机器算法——神经网络训练算法(Neural Network Training);以前一直觉得机器学习很高深,到处是超高等数学、线性代数、数理统计。入坑发现确实是这样!但是呢由项目实例驱动的学习比起为考试不挂科为目的的学习更为高效、实用!在遗传算法、神经网络算法的学习入门之后觉得数学只要用心看没问题的(即使是蒙特卡洛和马尔科夫问题),但是呢需要把数学统计应用到程序中,来解决实际的问题这是两码事。主要呢还是需要动手打代码。下面呢是今天的机器学习之神经网络学习入门记录篇,希望帮助到同样入门采坑的哥们,一起进步!

    一、主题闲扯

    神经网络学习-顾名思义,就是类似我们人类的学习方式,通过模拟神经元的活动,在神经系统中进行信息处理、存储记忆和反馈的生物机理功能。其实这样是机器学习算法的共性吧,所有的智能算法都是善于发现生活中的常见情节推广到计算仿真的范畴,例如:遗传算法、烟花算法、蚁群算法、模拟退火算法等等。
    神经网络学习是人工智能领域的基本算法之一,它是在1943年被心理学家McCulloch和数学家Pitts合作提出的数学模型。并在之后不断完善发展到今天的。它的主要应用领域涉及到模式识别、智能机器人、非线性系统识别、知识处理等。

    二、算法理论

    2.1、人工神经元模型
    神经元模型

    这里我们先解释一下机器学习的一些特性,总体来说呢,机器学习的核心就是学习。这个学习过程呢就是通过已知来训练机器。比如:我们通过大量的青蛙图像数据样本来进行输入训练算法,使得我们给这个程序算法一张新的青蛙图像,它能利用训练数据的学习来判断我们新给它的图像数据是青蛙。所以呢,机器学习算法来说就是通过输入变量到算法,算法通过分析反馈进行判断,最后做出结果。
    在上图中是简化的神经元模型,我们的Xi是一系列的输入变量,对应在其箭头方向上的是一个权重系数。权重系数呢是为了消除样本数据的偏差,通常是一个rand函数在0-1之间的取值。通过输入变量Xi和其自己的权重系数Wi的乘积的求和输入到神经元上。此时神经元得到了输入变量和其权重的乘积累加和。通过映射函数F(x)来进行映射得到结果。以上就是一个简单的神经元模型和信息传递过程。
    这里写图片描述

    也可以简化成下面的数学推导公式:我们可以把输入变量和对应权重变换成矩阵相乘,这在Matlab中的运算时是十分有利的。
    这里写图片描述

    对于以上的输入变量和对应权重值我们很容易处理,但是这个模型的核心是基于激活函数F(x)的,下面是我们常见的一些激活函数:
    激活函数

    2.2、神经网络模型
    我们的神经网络是由若干的神经元连接而成的,我们常见的模型分类为:
    1、连接方式:前向神经网络和递归神经网络*(反馈神经网络)
    2、训练方式:监督式学习和非监督式学习
    3、按照实现功能:拟合(回归)神经网络 vs. 分类神经网络

    2.3、BP(反向传递)神经网络概述:
    概述、
    1、Backpropagation is a common method of teaching artificial neural networks how to
    perform a given task.
    2、It is a supervised learning method, and is a generalization of the delta rule. It
    requires a teacher that knows, or can calculate, the desired output for any input in
    the training set.
    3、 Backpropagation requires that the activation function used by the artificial neurons
    (or “nodes”) be differentiable

    算法学习过程
    Phase 1:神经传递
    1. 通过神经网络进行训练模式输入的向前传播以产生传播的输出激活。
    2. 训练模式中通过神经网络对传播的输出激活进行反向传播,目标是生成所有输出和隐藏神经元的增量以便进行反馈调整。
    Phase 2: 权值更新
    1. 用它的输出增量和输入激活变量来得到权重的梯度。
    2. 通过从权重中减去它的比例来使权重朝着相反的梯度方向移动(最小梯度法)。

    算法递进过程图解:(Source:)
    该项目描述了利用反向传播算法实现多层神经网络的教学过程。为了说明这一过程,有两个输入和一个输出的三层神经网络,如下图所示:
    这里写图片描述

    1、每个神经元由两个单位组成。第一个单元添加权重系数和输入信号,第二个单元实现非线性功能,称为神经元激活功能。信号e是加法器输出信号,y=f(e)是非线性元件的输出信号。信号y也是神经元的输出信号。如下图:
    这里写图片描述

    2、为了训练神经网络,我们需要训练数据集。训练数据集由输入信号(x1和x2)组成,并分配相应的目标(期望输出)z。网络训练是一个迭代的过程。在每个迭代中权重系数的节点使用新的训练数据集的数据被修改。修改计算使用下面描述的算法:每个教学步骤开始迫使这两个输入信号从训练集,在这个阶段我们可以确定每个网络层中的每个神经元的输出信号值。下面的图片说明了信号是如何传播的。
    这里写图片描述
    同理如下:
    这里写图片描述

    这里写图片描述

    3、通过隐藏层传播信号。符号wmn表示下一层神经元的输出和神经元n的输入之间的连接。
    这里写图片描述

    这里写图片描述

    4、通过输出层传播信号
    这里写图片描述

    5、在接下来的算法步骤中,将网络y的输出信号与期望的输出值(目标)进行比较,在训练数据集中找到了输出信号。这种差异被称为输出层神经元的错误信号d。
    这里写图片描述

    6、直接计算内部神经元的错误信号是不可能的,因为这些神经元的输出值是未知的。多年来,多人网络训练的有效方法一直是未知的。只有在80年代中期,反向传播算法才被设计出来。这个想法是将错误信号d(在单个教学步骤中计算)返回给所有神经元,输出信号是被讨论神经元的输入信号。
    这里写图片描述

    这里写图片描述

    7、用于传播错误的权重系数,等于在计算输出值时使用的系数。只有数据流的方向被改变(信号从一个输出到另一个输入)。该技术适用于所有网络层。如果传播错误来自少数神经元,它们就会被添加。下面的例子是:
    这里写图片描述

    这里写图片描述

    这里写图片描述

    8、当计算每个神经元的错误信号时,可以修改每个神经元输入节点的权重系数。在下面的公式中,df(e)/de代表了神经元激活功能的导数(权重被修改)。
    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    8、系数h(罗马字符学习因子)影响网络训练速度。有一些技术可以选择这个参数。第一种方法是用参数的大值开始教学过程。当权重系数被确定时,参数正逐渐减少。第二种,更复杂的方法,开始以小的参数值教学。在教学过程中,在教学过程中,在教学过程中增加了参数,在最后阶段又减少了。以较低的参数值启动教学过程,可以确定权重系数的符号。

    插入重点:有导师学习的神经网络状态:

    有导师学习状态简而言之就是对输入的训练集,可以根据网络中的实际输出与期望输出之间的误差来反向调整个连接权值的学习方法。其主要步骤如下:

    1. 从样本数据中随机性的选取一个样本数据{Ai,Bi},其中Ai是输出,Bi是期望输出
    2. 通过训练得出实际输出Oi
    3. 求误差D = Bi - Oi
    4. 根据步骤3得到的误差D,来调整各隐含层之间连接权值
    5. 对,每个样本重复用以上步骤,直到对整体样本数据来说,误差收敛到控制范围内为止。

    有导师学习算法:Delta学习规则
    Delta是一种简单的经典有导师算法规则。根据实际输出与期望输出的差别;来调整连接权。其数学表达:
    这里写图片描述

    在上述公式中,Wij表示的是神经元 i 到 j之间的连接权di是神经元i的期望输出Yi是神经元 i 的实际输出**。Xj是神经元的状态。,如果是激活状态则为**1,否则为0或者-1
    通过神经元j的实际输出与期望值比较取值,我们可以知道Delta的本质,就是如果实际输出大于期望输出(di - yi)为负数,就是减小所有输入为正的连接权值。增大输入为负的权值。反之,如果实际输出小与期望输出。则增大输入为正的连接权值,减小输入为负的连接权值。


    2.4、数据归一化
    什么是归一化?
    将数据映射到[0, 1]或[-1, 1]区间或其他的区间。

    为什么要归一化?
    1. 输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
    2. 数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
    3. 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
    4. S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067

    归一化算法
    1、这里写图片描述
    其中min为x的最小值,max为x的最大值,输入向量为x,归一化后的输出向量为y。上式将数据归一化得到[0,1]区间,当激活函数采用S形函数时(值域为(0,1))时这条公式适用。
    2、这里写图片描述
    这条公式将数据归一化到[-1, 1]区间。当激活函数采用双极S形函数(值域为(-1,1))时,该公式适用。

    归一化算法重点知识函数:
    几个要说明的函数接口:

    [Y,PS] = mapminmax(X)
    [Y,PS] = mapminmax(X,FP)
    Y = mapminmax('apply',X,PS)
    X = mapminmax('reverse',Y,PS)

    用实例来讲解,测试数据 x1 = [1 2 4], x2 = [5 2 3];

    >> [y,ps] = mapminmax(x1)
    y =
       -1.0000   -0.3333    1.0000
    
    ps = 
          name: 'mapminmax'
         xrows: 1
          xmax: 4
          xmin: 1
        xrange: 3
         yrows: 1
          ymax: 1
          ymin: -1
        yrange: 2

    其中y是对进行某种规范化后得到的数据,这种规范化的映射记录在结构体ps中.让我们来看一下这个规范化的映射到底是怎样的?

    y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;
    [关于此算法的一个问题.算法的假设是每一行的元素都不想相同,那如果都相同怎么办?实现的办法是,如果有一行的元素都相同比如xt = [1 1 1],此时xmax = xmin = 1,把此时的变换变为y = ymin,matlab内部就是这么解决的.否则该除以0了,没有意义!]

    也就是说对x1 = [1 2 4]采用这个映射 f: 2*(x-xmin)/(xmax-xmin)+(-1),就可以得到y = [ -1.0000 -0.3333 1.0000]
    我们来看一下是不是: 对于x1而言 xmin = 1,xmax = 4;
    则y(1) = 2*(1 - 1)/(4-1)+(-1) = -1;
    y(2) = 2*(2 - 1)/(4-1)+(-1) = -1/3 = -0.3333;
    y(3) = 2*(4-1)/(4-1)+(-1) = 1;

    看来的确就是这个映射来实现的.
    对于上面algorithm中的映射函数 其中ymin,和ymax是参数,可以自己设定,默认为-1,1;

    比如:

    >>[y,ps] = mapminmax(x1);
    >> ps.ymin = 0;
    >> [y,ps] = mapminmax(x1,ps)
    y =
             0    0.3333    1.0000
    
    ps = 
          name: 'mapminmax'
         xrows: 1
          xmax: 4
          xmin: 1
        xrange: 3
         yrows: 1
          ymax: 1
          ymin: 0
        yrange: 1

    则此时的映射函数为: f: 1*(x-xmin)/(xmax-xmin)+(0)

    如果我对x1 = [1 2 4]采用了某种规范化的方式, 现在我要对x2 = [5 2 3]采用同样的规范化方式[同样的映射],如下可办到:

    >> [y1,ps] = mapminmax(x1);
    >> y2 = mapminmax('apply',x2,ps)
    y2 =
        1.6667   -0.3333    0.3333

    即对x1采用的规范化映射为: f: 2*(x-1)/(4-1)+(-1),(记录在ps中),对x2也要采取这个映射.
    x2 = [5,2,3],用这个映射我们来算一下.

    y2(1) = 2(5-1)/(4-1)+(-1) = 5/3 = 1+2/3 = 1.66667
    y2(2) = 2(2-1)/(4-1)+(-1) = -1/3 = -0.3333
    y2(3) = 2(3-1)/(4-1)+(-1) = 1/3 = 0.3333

    X = mapminmax(‘reverse’,Y,PS)的作用就是进行反归一化,讲归一化的数据反归一化再得到原来的数据:

    >> [y1,ps] = mapminmax(x1);
    >> xt = mapminmax('reverse',y1,ps)
    xt =
         1     2     4

    此时又得到了原来的x1(xt = x1);

    **

    三、神经网络参数定义以及对BP神经网络性能的影响

    **
    常见的训练函数:
    训练方法 训练函数
    梯度下降法 traingd
    有动量的梯度下降法 traingdm
    自适应lr梯度下降法 traingda
    自适应lr动量梯度下降法 traingdx
    弹性梯度下降法 trainrp
    Fletcher-Reeves共轭梯度法 traincgf
    Ploak-Ribiere共轭梯度法 traincgp
    Powell-Beale共轭梯度法 traincgb
    量化共轭梯度法 trainscg
    拟牛顿算法 trainbfg
    一步正割算法 trainoss
    Levenberg-Marquardt trainlm

    神经网路学习的参数:
    训练参数 参数介绍
    net.trainParam.epochs 最大训练次数(缺省为10)
    net.trainParam.goal 训练要求精度(缺省为0)
    net.trainParam.lr 学习率(缺省为0.01)
    net.trainParam.max_fail 最大失败次数(缺省为5)
    net.trainParam.min_grad 最小梯度要求(缺省为1e-10)
    net.trainParam.show 显示训练迭代过程(NaN表示不显示,缺省为25)
    net.trainParam.time 最大训练时间(缺省为inf)
    net.trainParam.mc 动量因子(缺省0.9)
    net.trainParam.lr_inc 学习率lr增长比(缺省为1.05)
    net.trainParam.lr_dec 学习率lr下降比(缺省为0.7)
    net.trainParam.max_perf_inc 表现函数增加最大比(缺省为1.04)
    net.trainParam.delt_inc 权值变化增加量(缺省为1.2)
    net.trainParam.delt_dec 权值变化减小量(缺省为0.5)
    net.trainParam.delt0 初始权值变化(缺省为0.07)
    net.trainParam.deltamax 权值变化最大值(缺省为50.0)
    net.trainParam.searchFcn 一维线性搜索方法(缺省为srchcha)
    net.trainParam.sigma 因为二次求导对权值调整的影响参数(缺省值5.0e-5)
    net.trainParam.lambda Hessian矩阵不确定性调节参数(缺省为5.0e-7)
    net.trainParam.men_reduc 控制计算机内存/速度的参量,内存较大设为1,否则设为2(缺省为1)
    net.trainParam.mu u的初始值(缺省为0.001)
    net.trainParam.mu_dec u的减小率(缺省为0.1)
    net.trainParam.mu_inc u的增长率(缺省为10)
    net.trainParam.mu_max u的最大值(缺省为1e10)

    神经网络学习主要函数说明
    newff:前馈网络创建函数
    语法:
    net = newff(A,B,{C},’trainFun’,’BLF’,’PF’)。
    A:一个n*2的矩阵,第i行元素为输入信号Xi的最大最小值
    B:一个K维行向量,其元素为网络中各个节点的数量。
    C:一个K维字符串行向量,每一个分量为对应层的神经元的激活函数,默认为“tansig”
    trainFun:为学习规则的采用的训练算法。默认为:“trainlm”
    BLF:BP权值/偏差学习函数。默认为:“learngdm”
    PF:性能函数,默认为“mse”

    train函数
    语法:
    即网络学习函数:
    [net,tr,YI,E] = train(net,X,Y)
    X:网络实际输入
    Y:网络应有输出
    tr:网络跟踪信息
    YI:网络实际输出
    E:误差矩阵

    sim函数
    **语法:**Y = sim(net,X)
    X:输入给网络的K*N矩阵,K为网络输入个数,N为样本数据量
    Y:输出矩阵Q*N,其中Q为网络输出个数

    四、实例解读:

    利用三层BP神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。
    样本数据:
    这里写图片描述

    代码如下:

    clear;
    clc;
    X=-1:0.1:1;
    D=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
        0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
        0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
    figure;
    plot(X,D,'*'); %绘制原始数据分布图
    net = newff([-1 1],[5 1],{'tansig','tansig'});
    net.trainParam.epochs = 100; %训练的最大次数
    net.trainParam.goal = 0.005; %全局最小误差
    net = train(net,X,D); 
    O = sim(net,X); 
    figure; 
    plot(X,D,'*',X,O); %绘制训练后得到的结果和误差曲线
    V = net.iw{1,1}%输入层到中间层权值
    theta1 = net.b{1}%中间层各神经元阈值
    W = net.lw{2,1}%中间层到输出层权值
    theta2 = net.b{2}%输出层各神经元阈值

    最后得到结果:
    这里写图片描述

    **

    五、学习总结

    **
    通过神经网络的学习入门,发现机器学习的共性和乐趣;由浅入深、循序渐进。虽然看起来很是晦涩难懂。但是一门心思钻进去,最后做出实例是一种巨大的喜悦和自豪。从中得到知识的喜悦和探索规律的满足。
    总结神经网络:
    1、导入需要处理的数据。
    2、对数据进行打乱,随机获取实验数据和目标数据。(其中包括归一化:mapminmax)
    3、构建一个训练网络:newwff
    4、对构建的网络进行训练:train
    5、进行数据仿真操作sin(net,x)
    6、验证和后评价
    7、绘图直观的显示数据模拟训练的效果。
    在上面的神经网络训练中,我们要清楚构建神经网络的实验数据和目标收敛数据都是从原始数据中随机获取的。

                                 **By:wangyun 2018-01-28 11:01:57**
    
    展开全文
  • 人工神经网络是一种模仿人脑结构及其功能的信息处理系统 能提高人们对信息处理的 智能化水平它是一门新兴的边缘和交叉学科它在理论模型 算法等方面比起以前有了 较大的发展但至今无根本性的突破还有很多空白点需要...
  • 使用java语言描述bp神经网络算法,该算法比较容易让人理解。
  • 神经网络算法详解 01:人工神经网络基础

    千次阅读 多人点赞 2020-03-25 20:18:17
    本文介绍了人工智能的发展历史,基本概念,应用领域;神经元模型,神经元的学习规则以及神经网络工作原理。本系列文章来自阿里云大学人工智能学习路线中的《神经网络概览及神经网络算法详解》课程。

    本文介绍了人工智能的发展历史,基本概念,应用领域;神经元模型,神经元的学习规则以及神经网络工作原理。本系列文章来自阿里云大学人工智能学习路线中的《神经网络概览及神经网络算法详解》课程。


    系列文章:

    1. 【神经网络算法详解 01】-- 人工神经网络基础
    2. 【神经网络算法详解 02】 – 感知神经网络与反向传播算法(BP)
    3. 【神经网络算法详解 03】 – 竞争神经网络【SONN、SOFM、LVQ、CPN、ART】
    4. 【神经网络算法详解 04】 – 反馈神经网络 【Hopfield、DHNN、CHNN、BAM、BM、RBM】
    5. 【神经网络算法详解 05】-- 其它类型的神经网络简介【RBF NN、DNN、CNN、LSTM、RNN、AE、DBN、GAN】


    1. 人工神经网络(ANN)及人工智能(AI)

    • 智能(Intelligence) 是个体有目的的行为,合理的思维以及有效的适应环境的综合能力。或者说智能是个体认识客观事物和运用知识解决问题的能力。
    • 人工智能(Artificial Intelligence,AI) 最初在1956年被引入,它主要研究怎样让计算机模仿人脑从事准理、设计、思考、学习等思维活动,以解决和处理较复杂的问题。简单的讲,人工智能就是研究如何让计算机模仿人脑进行工作。
    • 人工神经网络(Artificial Neural Network,ANN) 是一种旨在模仿人脑结构及其功能的脑式智能信息处理系统。通常以数学和物理的方法以及信息处理的角度对人脑神经网络进行抽象,并建立某种简化模型。简单的讲,它是一种数学模型,可以用电子线路来实现,也可以通过计算枧程序来模拟,是人工智能的一种研究方法。

    1.1 智能(Intelligence)

    智能(Intelligence)】是个体有目的的行为,合理的思维以及有效的适应环境的综合能力。或者说智能是个体认识客观事物和运用知识解决问题的能力。

    通常认为智能包含以下方面的能力:

    • 感知与认识客观事物、客观世界和自我的能力:人类生存最基本的能力,感知是智能的基础;
    • 通过学习取得知识与积累经验的能力:人类能够持续发展的最基本的能力;
    • 理解知识,运用知识经验去分析、解决问题的能力:智能的高级形式,人类改造世界的基本能力;
    • 联想、推理、判断和决策的能力:智能的高级形式,人类对未来和未知的预测、应对能力;
    • 运用语言进行抽象、概括的能力:是形式化描述的基础;
    • “发现、发明、创造和创新的能力:是第三种能力的高级体现;
    • 实时、迅速、合理地应付复杂环境的能力:实时反映能力,也是人类生存的基本能力;
    • 预测、洞察事物发展、变化的能力:根据历史信息和经验,判断事物未来的发展。

    1.2 人工智能(Artificial Intelligence)

    人工智能(Artificial Intelligence,AI)】 最初在1956年被引入,它主要研究怎样让计算机模仿人脑从事准理、设计、思考、学习等思维活动,以解决和处理较复杂的问题。简单的讲,人工智能就是研究如何让计算机模仿人脑进行工作。

    由于研究的出发点、方法学以及应用领域的不同,有多个代表性的流派:

    • 符号主义学派:Newell和Simon在1967年提出的假说,认为人工智能源于数学逻辑,通过数学逻辑来描述智能行为,后来发展了启发式算法 --> 专家系统 --> 知识工程的理论。
    • 联接主义学派:代表人物为McCulloch和Pitts,认为人工智能源于仿生学,特别是人脑的研究,并提出了MP模型,后来基于该模型衍生出人工神经网络等
    • 行为主义学派:认为人工智能源于控制论,Wiener等提出的控制论和自组织系统等,立足于模拟人在控制过程中的智能行为和作用,如自组织、自寻优、自适应、自学习等。

    1.3 ANN的发展历史

    萌芽期(?-1949)

    • 1943年,心理学家McCulloch和数学家Pitts根据神经元提出M-P模型,打下坚实基础;
    • 1949年,心理学家Hebb提出了人工神经网络的学习规则,称为模型的训练算法的起点。

    第一高潮期(1950-1968)

    • 单层感知器:研究者通过电子线路或者计算机去实现单层感知器,包括Minsky、Rosenblatt等,被用于各种问题求解,甚至某个阶段内被乐观的认为找到了智能的根源。

    反思期(1969-1981)

    • 1969年,Minsky和Papert发表论文《Perceptron》,从理论上严格证明了单层感知器无法解决异或问题从而引申到无法解决线性不可分的问题,由于大部分问题都是线性不可分的,所以单层感知器的能力有限,人们对ANN的研究进入反思期。
    • 也取得到了一些积极成果,如Arbib的竟争模型、Kohonen的自组织映射、Grossberg的自适应共振模型(ART)、RumeIIhart等人并行分布处理模型(PDP)等。

    第二高潮期(1982-90年代).

    • 1982年Hopfield提出循环网络,1984年研制了HopfiIed网络,解决了TSP问题;
    • 1985年,美国加州大学圣地亚哥分校的Hinton、Rumellhart等提出了Boltzmann机;
    • 1986年RumeIIhart等人提出了用于多层网络训练的BP算法对ANN起到了重大的推动作用;
    • 1987年,第一届神经网络国际会议在加州,1600+人参加,1990年12月,国内第一届在北京举行。

    新时期(90年代至今)

    • 神经网络已经成为涉及神经生理科学、认知科学、数理科学、心理学、信息科学、计算机科学、微电子学、光学、生物电子学等多学科交叉、综合的前沿学科;
    • 神经网络的应用已经渗透到模式识别、图像处理、非线性优化、语音处理、自然语言理解、自动目标识别、机器人、专家系统等领域,并取得了令人瞩目的成果;
    • 各种会议、论坛、刊物、活动等越来越多;
    • 除了神经研究本身的突破和进展之外,相关的领域也都取得了长足的发展。

    1. ANN与大数据
      在这里插入图片描述

    1. ANN的基本特征
    • 结构特点
      • 信息处理的并行性:单个单元处理简单,可以大规模并行处理,有较快的涑度;
      • 信息存储的分布性:信息不是存储在网络中的局部,而是分布在网络所有的连接权中;
      • 信息处理单元的互联性:处理单元之间互联,呈现出丰富的功能;
      • 结构的可塑性:连接方式多样,结构可塑。
    • 性能特点
      • 高度的非线性:多个单元链接,体现出非线性;
      • 良好的容错性:分布式存储的结构特点使容错性好;
      • 计算的非精确性:当输入模糊信息时,通过处理连续的模拟信号及不精确的信息逼近解而非精确解。
    • 能力特征
      • 自学习、自组织与自适应性:根据外部环境变化通过训练或感知,能调节参数适应变化(自学习),并可按输入刺激调整构建神经网络(自组织)。

    1. ANN的基本功能
      在这里插入图片描述

    2. 神经元模型

    2.1 神经元结构

    在这里插入图片描述

    2.2 生物神经元模型

    在这里插入图片描述

    2.3 信息处理机制

    生物神经元的信息的产生、传递和处理是一种电化学活动,其机制为:

    • 信息产生:在某一给定时刻,神经元总是处于静息、兴奋和抑制三种状态之一。在外界的刺激下,当神经元的兴奋程度大于某个阈电位时,神经元被激发而发出神经脉冲。
    • 传递与接收:神经脉冲信号沿轴突传向其末端的各个分支,通过突触完成传递与接收。突触有兴奋性突触和抑制性性突触两种,当兴奋性突触的电位超过某个阈电位时,后一个神经元就有神经脉冲输出,从而把前一个神经元的信息传递给了后一个神经元。
    • 信息整合:接收各个轴突传来的脉冲输入,根据输入可到达神经元的不同部位,输入部位不同,对神经元影响的权重也不同。在同一时刻产生的刺激所引起的电位变化大致等于各单独刺激引起的电位变化的代数和。神经元对空间和时间上对输入进行积累和整合加工,从而决定输出的时机和强弱。
    • 生物神经网络:由多个生物神经元以确定方式和拓扑结构互相连接即形成生物神经网络,是一种更为灵巧、复杂的生物信息处理系统,在宏观上呈现出复杂的信息处理能力。

    2.4 M-P模型

    在这里插入图片描述
    神经元特点:

    • 多个输入单个输出
    • 多输入累加整合
    • 不同输入仅重不同
    • 阈值特性

    M-P模型:是把神经元视为二值开关元件,按照不同方式组合来完成各种逻辑运算。能够构成逻辑与、非、或,理论上可以进而组成任意复杂的逻辑关系,若将M-P模型按一定方式组织起来,可以构成具有逻辑功能的神经网络。
    在这里插入图片描述
    在这里插入图片描述

    2.5 激活函数

    激活函数 (Activation Function):也叫连接函数、传递函数、变换函数或者激励函数。用来模拟神经元输出与具激活状态之间的联系:输入达到某个阈值后达到激活状态,否则为抑制态。不同的激活函数,会使神经元具有不同的信息处理特性。**对于神经网络来讲,激活函数的主要作用就是进行线性变换,增加系统的非线性表达能力。**常见的激活函数有:
    在这里插入图片描述


    3. 神经网络模型

    3.1 神经网络模型分类

    3.1.1 按照拓扑结构划分

    可分为层次结构互连结构

    1. 层次结构:
      在这里插入图片描述
    2. 互连结构
    • 全互连:每个节点都和其他所有节点连接
    • 局部互连:每个节点只与其临近节点有连接
    • 稀疏连接:节点只与少数相距较远的节点有连接
      在这里插入图片描述

    3.1.2 按照信息流向划分

    可分为前馈性网络和反馈性网络

    • 前馈型网络:网络信息从输入层到各藏层再到输出层逐层前进。
    • 反馈型网络:反馈网络中所有节点都具有信息处理功能,并且每个节点既可以接收输入同时又可以进行输出。
      在这里插入图片描述

    3.2 前馈神经网络

    前馈神经网络(Feed Forward NN)是一种最简单的神经网络,采用单向多层结构,各神经元分层排列,每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层,各层间没有反馈。

    前馈网络包括三类节点:

    • 输入节点(lnput Nodes):外界信息输入,不进行任何计算,仅向下一层节点传递信息;
    • 隐藏节点(Hidden Nodes):接收上一层节点的输入,进行计算,并将信息传到下一层节点;
    • 输出节点(OutputNodes):接收上一层节点的输入,进行计算,并将结果输出;

    输入层和输出层必须有,隐藏层可以没有,即为单层感知器,隐藏层也可以不止一层,有隐藏层的前馈网络即多层感知器。
    在这里插入图片描述

    3.3 反馈神经网络

    反馈神经网络(Feed Back NN):又称递归网络、回归网络,是一种将输出经过一步时移再接入到输入层的神经网络系统。这类网络中,神经元可以互连,有些神经元的输出会被反馈至同层甚至前层的神经元。常见的有HopfieId神经网络、Elman神经网络、Boltzmann机等。

    3.4 前馈神经网络和反馈神经网络的主要区别

    • 前馈神经网络各层神经元之间无连接,神经元只接受上层传来的数据,处理后传入下一层,数据正向流动;反馈神经网络层间神经元有连接,数据可以在同层间流动或反馈至前层。
    • 前馈神经网络不考虑输出与输入在时间上的滞后效应,只表达输出与输入的映射关系;反馈神经网络考虑输出与输入之间在时间上的延迟,需要用动态方程来描述系统的模型。
    • 前馈神经网络的学习主要采用误差修正法(如BP算法),计算过程一般比较慢,收敛速度也比较慢;反馈神经网络主要采用Hebb学习规则,一般情况下计算的收敛速度很快。
    • 相比前馈神经网络,反馈神经网络更适合应用在联想记忆和优化计算等领域。

    3.5 前馈与反馈

    在这里插入图片描述


    4. 神经元网络学习规则

    4.1 基本概念

    学习:通过训练使个体在行为上产生较为持久改变的过程,一般来说效果随着训练了的增加而提高,即通过学习获得进步。

    人工神经网络的功能由其连接的拓扑结构和网络的连接仅值决定,其全体的权值 w w w 整体反映了神经网络对于所解决问题的知识存储。即一旦拓扑结构和权值确定,该网络可以应用于新的数据得到结果。

    人工神经网络的学习:通过对样本的学习训练,不断改变网络的拓扑结构及连接权值,使得输出不断的接近期望输出值。

    通过训练改变权值的规则被称为学习算法或者学习规则,有时也称作训练规则或者训练算法,学习规则对人工神经网络非常重要。

    4.2 学习规则类型

    按照一般的分类标准,通常分为三类:

    • 有监督学习学习模式为纠错
      不断的给网络提供一个输入即其期望的正确输出(称教师信号),将ANN的实际输出和期望输出作比较,不符时,按照一定规则调整权值参数,重新计算、比较,直到网络对于给定的输入均能产生期望的输出。则认为该网络训练完成,即已学会样本数据中的知识和规则。即可用于解决实际问题。

    • 无监督学习学习模式为自组织
      学习时不断给网络提供动态输入信息,网络根据特有的内部结构和学习规则,在输入信息流中发现可能的模式和规律,同时根据网络功能和输入信息调整仅值(自组织)。使网络能对属于同一类的模式进行自动分类。该模式网络权值的调整不取决于教师信号,网络的学习评价标准隐含于网络内部。

    4.3 赫布法则

    4.3.1 由来

    在这里插入图片描述
    D o n a l d   O .   H e b b Donald \ O. \ Hebb Donald O. Hebb
    赫布法则(Heb’s rule):在《The Organization of Behavior》书中解释了学习过程中大脑中的神经细胞是如何改变和调整的,认为知识和学习发生在大脑主要是通过神经元间突触的形成与变化。当细胞A的轴突足以接近激发细胞B,并反复持续地对细胞B放电,一些生长过程或代谢变化将发生在某一个或这两个细胞内,以致A作为对B放电的细胞中的一个效率增加。通俗来讲就是两个神经细胞交流越多,它们连接的效率就越高,反之就越低。

    McCulloch-Pitts模型缺乏一个对人工智能而言至关重要的学习机制,M-P模型很好的简化、模拟了神经元,但是无法通过学习的方式调整、优化权重,形成有效的模型。赫布法则的出现,成为神经模型训练(学习机制)的基础性工作。

    在这里插入图片描述
    И в а н   П е т р о в и ч   П а в л о в Иван \ Петрович \ Павлов Иван Петрович Павлов
    巴浦洛夫的条件反射实验:每次给狗喂食前都先响铃,时间一长,狗就会将铃声和食物朕系起来。以后如果铃响但是不给食物,狗也会流口水。

    受此实验启发,Hebb的理论认为在同一时间被激发的神经元间的朕系会被强化。例如,铃声响时一个神经元被激发,在同一时间食物的出现会激发附近的另一个神经元,那么这两个神经元间的联系会被强化,从而记住这两个事物之间存在着联系。相反,如果两个神经元总是不能同步激发,那么它们之间的朕系将会越来越弱。

    赫布规则被作为无监督神经网络的学习规则,广泛应用于自组织神经网络、竞争网络中。

    4.3.2 赫布学习规则

    在这里插入图片描述
    赫布学习规则的步骤:

    • 初始化权值参数 W W W,一般赋于 0 附近的随机数;
    • 初始化学习率 η \eta η
    • 对所有输入记录:根据输入记录,更新权重值;

    4.3.3 赫布学习规则实例

    带入第一个样本更新权重:
    在这里插入图片描述
    带入第二个样本更新权重:
    在这里插入图片描述
    带入第三个样本更新权重:
    在这里插入图片描述

    4.4 离散感知器学习规则

    **感知器(Perceptron)**是由Rosenblatt定义的具有单层神经计算单元的神经网络结构。实际上为一种前馈网络,同层内无互连,不同层间无反馈,由下层向上层传递,其输入、输出均为离散值,神经元对输入加权求和后,由阈值函数(激活函数)决定其输出。

    离散感知器学习规则代表一种有导师的学习方式,其规定将神经元期望输出(教师信号)与实际输出之差作为学习信号,通过训练调整权值,直到实际输出满足要求(等于或者接近于期望输出)。
    在这里插入图片描述
    离散感知器学习规则的步骤:

    • 初始化权值参数,学习速率;
    • 对每一个样本,实际输出和期望输出的差满足要求:根据输入记录,更新权重值;

    4.4.1 实例

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    验证:
    在这里插入图片描述

    4.5 连续感知器学习规则

    在这里插入图片描述
    M c C l e l l a n d McClelland McClelland
    DeIta习规则( δ \delta δ LearningRule):1986年,由认知心理学家McCIeIIand和RumeIIhart在神经网络训练中引入了学习规则。一种简单的有导师学习算法,该算法根据神经元的实际输出与期望输出差别来调整连接权。

    Delta学习规则的思路如下:系统首先用一个输入向量,输入网络结构,得到一个输出向量;每个输入向量都有一个对应的期望输出向量、或者称作是目标向量;比较实际输出向量与期望输出向量的差别,若没有差别,就不再继续学习;否则,连接的权重修改对应的差值(delta差)。

    4.5.1 损失函数

    损失函数(Loss Function):用于衡量最优的策略,通常是一个非负实值函数。机器学习试图通过不断的学习,建立一个可以很好预测现实结果的模型,损失函数则是用来衡量预测结果和真实结果之间的差距,其值越小,代表预测结果和真实结果越一致。损失函数越合适,通韋模型的性能越好。通过各种方式缩小损失函数的过程被称作优化·损失函数记做 L ( Y , f ( x ) ) L(Y,f(x)) L(Y,f(x))

    0-1损失函数(0-1 LF):预测值和实际值精确相等则“没有损失”,为0,否则意味着“完全损失”,为1,预测值和实际值精确相等有些过于严格,可以采用两者的差小于某个阈值的方式:
    在这里插入图片描述

    绝对值损失函数(AbsoIuteLF):预测结果与真实结果差的绝对值。简单易懂,但是计算不方便。
    L ( Y , f ( x ) ) = ∣ Y − f ( X ) ∣ L(Y,f(x)) = |Y - f(X)| L(Y,f(x))=Yf(X)
    平方损失函数(Quadratic LF):预测结果与真实结果差的平方。
    L ( Y , f ( x ) ) = ( Y − f ( X ) ) 2 L(Y,f(x)) = (Y - f(X))^2 L(Y,f(x))=(Yf(X))2

    平方损失函数优势有:

    • 每个样本的误差都是正的,累加不会被抵消;
    • 平方对于大误差的惩罚大于小误差;
    • 数学计算简单、友好,导数为一次函数。
      在这里插入图片描述

    对数损失函数(Logarithmic LF) 或对数似然损失函数(log-likehood loss function)对数函数具有单调性,在求最优化问题时,结果与原始目标一致。可将乘法转化为加法,简化计算。
    L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) L(Y,P(Y|X)) = -logP(Y|X) L(Y,P(YX))=logP(YX)
    指数损失函数(ExponentiaI LF) 或对数似然损失函数(likehood loss function):单调性、非负性的优良性质,使得越接近正确结果误差越小。
    L ( Y , f ( x ) ) = e − Y ∗ f ( X ) L(Y,f(x)) = e^{-Y*f(X)} L(Y,f(x))=eYf(X)

    折叶掼失函数(HingeLF):也称铰链损失,对于判定边界附近的点的惩罚力度较高,常见于SVM。
    L ( f ( x ) ) = m a x ( 0 , 1 − f ( x ) ) L(f(x)) = max(0,1-f(x)) L(f(x))=max(0,1f(x))

    不同的损失函数有不同的持点,适用于不同的场景:

    • 0-1:理想状况模型
    • Log:逻辑回归、交叉熵
    • Squared:线性回归
    • Exponential:AdaBoosting
    • Hinge:SVM、soft margin

    4.5.2 损失函数优化:梯度下降法

    在这里插入图片描述

    4.5.3 δ \delta δ 规则

    在这里插入图片描述

    4.5.4 最小均方学习规则

    在这里插入图片描述

    4.5.5 相关学习规则

    在这里插入图片描述

    4.5.6 竞争学习&胜者为王

    竞争学习(Competition Learning) 是人工神经网络的一种学习方式,指网络单元群体中所有单元相互竟争对外界刺激模式响应的权利。竟争取胜的单元的连接权重向着对这一刺激有利的方向变化,相对来说竟争取胜的单元抑制了竟争失败单元对刺激模式的响应。属于自适应学习,使网络单元具有选择接受外界刺激模式的特性。竟争学习的更一般形式是不仅允许单个胜者出现,而是允许多个胜者出现,学习
    发生在胜者集合中各单元的连接权重上。

    胜者为王学习规则(Winner-Take-All)。无导师学习,将网络的某一层设置为竞争层,对于输入 X X X 竞争层的所有 p p p 个神经元均有输出响应,响应值最大的神经元在竟争中获胜,即: W m T X = m a x i = 1 , 2 , . . . p ( W i T X ) W^T_mX = max_{i=1,2,...p}(W^T_iX) WmTX=maxi=1,2,...p(WiTX)。获胜的神经元才有权调整其权向量 W m Wm Wm,调整量为: δ W m = a ( X − W m ) , α ∈ ( 0 , 1 ] \delta W_m =a(X - W_m),\alpha \in(0,1] δWm=a(XWm)α01] 随着学习而减小。

    在竞争学习过程中,竞争层的各神经元所对应的权向量逐渐调整为输入样本空间的聚类中心。

    在实际应用中通常会定义以获胜神经元为中心的邻域,所在邻域内的所有神经元都进行权重调整。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.5.7 外形学习规则

    内星节点:总是接收其他神经元输入的加权信号,是信号的汇聚点,其对应的权值向量称作内星权向量
    外星节点:总是向其他神经元输出加权信号,是信号的发散点,其对应的权值向量称作外星权向量
    在这里插入图片描述
    两者的更新规则:

    • 内星属于无导师学习,外星属于有导师学习;
    • 内星更新依赖于输入和权重的差异,外星更新依赖于输出和权重的差异。

    课程链接:https://edu.aliyun.com/course/1923

    展开全文
  • 探讨神经网络算法人工智能识别中的应用.pdf
  • 本技术用简单的二元差分算子和二元求和算子及其迭代架构,实现了对声音、图像和高维流形数据处理的快速新...并行的网络算法具有显然的几何和物理意义,企图解决现有神经网络不透明的黑盒子问题及学习速度慢等重大问题。
  • 人工神经网络的许多算法已在智能信息处理系统中获得广泛采用,尤为突出是是以下4种算法:ART网络、LVQ网络、Kohonen网络Hopfield网络,下面就具体介绍一下这这四种算法: 1.自适应谐振理论(ART)网络 自适应谐振...
  • 【计算智能】用人工神经网络算法求解TSP问题
  • python神经网络算法与深度学习视频教程机器学习人工智能算法实战
  • 神经网络算法源程序大全神经网络算法源程序大全神经网络算法源程序大全神经网络算法源程序大全
  • 神经网络算法,是使用计算机模拟生物神经系统,来模拟人类思维方式的算法。它的基本单位就是人工神经元。通过相互连接形成一张神经网络。 生物神经网络中,每个神经元与其他神经元连接,当它“激活”时,会传递...

    一、单个神经元

    神经网络算法,是使用计算机模拟生物神经系统,来模拟人类思维方式的算法。它的基本单位就是人工神经元。通过相互连接形成一张神经网络。

    生物神经网络中,每个神经元与其他神经元连接,当它“激活”时,会传递化学物质到相连的神经元,改变其他神经元的电位,当电位达到一定“阈值”,那么这个神经元也会被激活。

    单个人工神经元的计算公式:

    其中:

     为输入参数向量,表示其他神经元输入的信号。

     为每个输入参数的权重值,表示对应神经元信号的权重。

    θ为阈值或者偏差值,是指该激活神经元的难易程度。

    y为神经元的输出值,表示该神经元是否被激活。

    Act()为激活函数,理想的激活函数是下图(a)中的跃阶函数,“1”为神经元兴奋,“0”为神经元抑制,但由于跃阶函数具有不是连续可导等不好的性质,因此一般采用下图(b)的Sigmoid函数作为激活函数。

     

    二、全连接神经网络结构

    我们来定义一个全连接神经网络:

    全连接神经网络,就是指每一层的每个神经元都和下一层的每个神经元相连接。

    Layer:0为输入层,

    Layer:L为输出层

    其他L-1个Layer为隐层

    输入x

     

    我们称一个输入值x为一个样本

    输出 y

    变量的上标(0)(L),表示该变量处于神经网络的哪一层。

    表示第L层编号为i的神经元。 表示第L层的神经元数量。

    更好的理解神经网络,可观看此视频:https://www.bilibili.com/video/av15532370

     

    三、反向传播算法(BP算法)

    下面来说明如何调整一个神经网络的参数,也就是误差反向传播算法(BP算法)。以得到一个能够根据输入,预测正确输出的模型。

    1、首先我们要了解优化的目标

    根据人工神经元的定义,有以下三个公式:

    其中,Act()是激活函数,之前已经说过。

    根据公式(2)和公式(3),可以得出各个神经元之间的通用计算公式,如下所示:

    公式(4)是人工神经网络正向传播的核心公式。

     

    那么,我们根据什么来调整神经网络的参数,以得到一个能够正确预测结果的模型呢?请看下面的公式:

    公式(5)用来计算我们期望的输出和实际输出的“差别”,其中cost()叫做损失函数。我们的期望是损失值达到最小。

    但是,只根据一次输出的损失值,对参数进行调整,无法使模型适应所有输入样本。我们需要的是,调整参数,使得所有输入样本,得到输出的总损失值最小,而不是只让其中一个样本的损失值最小,导致其他样本损失值增大。因此有如下公式:

    公式(6)表示一个batch的所有样本输出的总损失值的平均值。其中,bn表示一个batch中样本的数量。

    为什么不用所有的样本计算损失值,而将所有样本分成一个个的batch呢?因为所有的训练样本数量太大了,可能有数以百万计,将所有的样本损失值都一起进行运算,计算量过于庞大,大大降低了模型计算的速度。

    公式(6)中计算总的损失值C,其实是一个以所有的连接权值ω和所有的阈值θ未为变量的多元函数。我们想要的模型就是求得C最小时,所有ω和θ的值。直接计算显然是不可能的,因为对于一个大的深度神经网络,所有的参数变量,可能数以万计。

    在这里我们使用梯度下降算法来逐步逼近C的最小值,也就是先随机得到一组参数变量的值,然后计算参数变量当前的梯度,向梯度的反方向,也就是C变小最快的方向,逐步调整参数值,最终得到C的最小值,或者近似最小值。

    而将所有样本,随机分成一个个固定长度的batch,以得到近似的梯度方向,叫做随机梯度下降算法

    更好理解梯度下降算法,逐步求得最优的参数值,可观看此视频:https://www.bilibili.com/video/av16144388

     

    2、开始求梯度

    那么,根据梯度的定义,接下来的任务,就是求取各个参数变量相对于C的偏导数。我们将使用误差反向传播算法来求取各个参数变量的偏导数。

    这里先剧透一下,求取参数偏导数的方法,和神经网络正向传播(根据样本计算输出值)的方式类似,也是逐层求解,只是方向正好相反,从最后一层开始,逐层向前。

    更好的理解误差反向传播算法,可观看此视频:https://www.bilibili.com/video/av16577449

    首先,我们先求神经网络最后一层,也就是输出层的相关参数的偏导数。为了降低推导的复杂性,我们只计算相对于一个样本的损失值函数Cbi的偏导数,因为相对于总损失值函数C的偏导数值,也不过是把某个参数的所有相对于Cbi偏导数值加起来而已。

    根据公式(2)、公式(3)、公式(5),以及“复合函数求导法则”,可以得到输出层(L层)某个神经元的权值参数ω的偏导数,计算公式如下:

    根据公式(5)可以得到:

    根据公式(2)可以得到:

    根据公式(3)可以得到:

    将公式(8)(9)(10),带入公式(7),可以得到:

     

    我们令:

    根据公式(8)(9)则有:

    将公式(13),带入公式(11),可以得到:

    这样我们就得到了输出层L相关的权值参数ω的偏导数计算公式!

    接下来,同理可得输出层L相关的阈值θ的偏导数计算公式为:

    而根据公式(3)可以得到:

    将公式(16)带入公式(15)可以得到:

    这就是输出层L相关的阈值θ的偏导数计算公式!

     

    3、根据L层,求前一层参数的偏导函数

    由公式(3)可知,一个权值参数ω只影响一个L-1层的神经元,因此有:

    根据公式(3)可以得到:

    将公式(19)带入公式(18)可以得到:

    根据公式(12)可以得到:

    将公式(21)带入公式(20)可以得到:

    同理,我们可以得到:

    根据公式(3)可以得到:

    将公式(24)带入公式(23)可以得到:

    这样我们就得到了L-1层神经元相关参数的计算公式!

     

    下面,我们还需要推导一下 之间的关系,根据公式(2)可以得到:

    同样根据公式(2)可以得到:

    将公式(27)带入公式(26)可以得到:

    由公式(3)可知,一个权值参数ω只影响一个L-1层的神经元,但这个L-1层神经元影响了所有L层的神经元。因此,根据“多元复合函数求导法则”有:

    根据公式(12)可以得到:

    将公式(27)带入公式(26)可以得到:

    根据公式(3)可以得到:

    将公式(32)带入到公式(31)可以得到:

    将公式(33)带入公式(28)可以得到:

    这样我们就得到了反向传播,逐层推导的通用公式:

    在这里,ω和z都是正向传播过程中,已经算好的常数,而  可以从L层开始逐层向前推导,直到第1层,第0层是输入层,不需要调整参数。而第L层的   可参考公式(13)。

     

    下面是全连接神经网络的python实现代码:

    #coding=utf-8
    import numpy as np
    import matplotlib.pylab as plt
    import random
    
    class NeuralNetwork(object):
        def __init__(self, sizes, act, act_derivative, cost_derivative):
            #sizes表示神经网络各层的神经元个数,第一层为输入层,最后一层为输出层
            #act为神经元的激活函数
            #act_derivative为激活函数的导数
            #cost_derivative为损失函数的导数
            self.num_layers = len(sizes)
            self.sizes = sizes
            self.biases = [np.random.randn(nueron_num, 1) for nueron_num in sizes[1:]]
            self.weights = [np.random.randn(next_layer_nueron_num, nueron_num)
                for nueron_num, next_layer_nueron_num in zip(sizes[:-1], sizes[1:])]
            self.act=act
            self.act_derivative=act_derivative
            self.cost_derivative=cost_derivative
    
        #前向反馈(正向传播)
        def feedforward(self, a):
            #逐层计算神经元的激活值,公式(4)
            for b, w in zip(self.biases, self.weights):
                a = self.act(np.dot(w, a)+b)
            return a
    
        #随机梯度下降算法
        def SGD(self, training_data, epochs, batch_size, learning_rate):
            #将训练样本training_data随机分为若干个长度为batch_size的batch
            #使用各个batch的数据不断调整参数,学习率为learning_rate
            #迭代epochs次
            n = len(training_data)
            for j in range(epochs):
                random.shuffle(training_data)
                batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]
                for batch in batches:
                    self.update_batch(batch, learning_rate)
                print("Epoch {0} complete".format(j))
    
        def update_batch(self, batch, learning_rate):
            #根据一个batch中的训练样本,调整各个参数值
            nabla_b = [np.zeros(b.shape) for b in self.biases]
            nabla_w = [np.zeros(w.shape) for w in self.weights]
            for x, y in batch:
                delta_nabla_b, delta_nabla_w = self.backprop(x, y)
                nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
                nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
            #计算梯度,并调整各个参数值
            self.weights = [w-(learning_rate/len(batch))*nw for w, nw in zip(self.weights, nabla_w)]
            self.biases = [b-(learning_rate/len(batch))*nb for b, nb in zip(self.biases, nabla_b)]
    
        #反向传播
        def backprop(self, x, y):
            #保存b和w的偏导数值
            nabla_b = [np.zeros(b.shape) for b in self.biases]
            nabla_w = [np.zeros(w.shape) for w in self.weights]
            #正向传播
            activation = x
            #保存每一层神经元的激活值
            activations = [x]
            #保存每一层神经元的z值
            zs = []
            for b, w in zip(self.biases, self.weights):
                z = np.dot(w, activation)+b
                zs.append(z)
                activation = self.act(z)
                activations.append(activation)
            #反向传播得到各个参数的偏导数值
            #公式(13)
            d = self.cost_derivative(activations[-1], y) * self.act_derivative(zs[-1])
            #公式(17)
            nabla_b[-1] = d
            #公式(14)
            nabla_w[-1] = np.dot(d, activations[-2].transpose())
            #反向逐层计算
            for l in range(2, self.num_layers):
                z = zs[-l]
                sp = self.act_derivative(z)
                #公式(36),反向逐层求参数偏导
                d = np.dot(self.weights[-l+1].transpose(), d) * sp
                #公式(38)
                nabla_b[-l] = d
                #公式(37)
                nabla_w[-l] = np.dot(d, activations[-l-1].transpose())
            return (nabla_b, nabla_w)
    
    #距离函数的偏导数
    def distance_derivative(output_activations, y):
        #损失函数的偏导数
        return 2*(output_activations-y)
    
    # sigmoid函数
    def sigmoid(z):
        return 1.0/(1.0+np.exp(-z))
    
    # sigmoid函数的导数
    def sigmoid_derivative(z):
        return sigmoid(z)*(1-sigmoid(z))
    
    if __name__ == "__main__":
        #创建一个5层的全连接神经网络,每层的神经元个数为1,8,5,3,1
        #其中第一层为输入层,最后一层为输出层
        network=NeuralNetwork([1,8,5,3,1],sigmoid,sigmoid_derivative,distance_derivative)
    
        #训练集样本
        x = np.array([np.linspace(-7, 7, 200)]).T
        #训练集结果,由于使用了sigmoid作为激活函数,需保证其结果落在(0,1)区间内
        y = (np.cos(x)+1)/2
    
        #使用随机梯度下降算法(SGD)对模型进行训练
        #迭代5000次;每次随机抽取40个样本作为一个batch;学习率设为0.1
        training_data=[(np.array([x_value]),np.array([y_value])) for x_value,y_value in zip(x,y)]
        network.SGD(training_data,5000,40,0.1)
    
        #测试集样本
        x_test = np.array([np.linspace(-9, 9, 120)])
        #测试集结果
        y_predict = network.feedforward(x_test)
    
        #图示对比训练集和测试集数据
        plt.plot(x,y,'r',x_test.T,y_predict.T,'*')
        plt.show()

     

    展开全文
  • 人工智能系统中的TSP、九宫图、bayes、BP神经网络算法编程实现及实验报告
  • BP神经网络算法

    2019-03-01 09:57:09
    本资源为BP神经网络算法,内有BP算法源码和Breast.dat数据文件,可以直接用matlab软件打开运行.
  • 本文简介数学建模常用的智能优化算法:神经网络算法

    智能优化算法: 神经网络算法

    人工神经网络的构筑是受生物神经网络的运作而启发的. 人工神经网络通常通过一个基于数学统计学类型的学习方法从而得以优化, 因此人工神经网络也可被看作是数学统计学方法的一种应用.

    通过统计学的标准数学方法, 我们可以得到大量的, 可用函数表达的局部结构空间, 在人工智能学的人工感知领域, 通过数学统计学的应用可以解决人工感知方面的决定问题, 这种方法比起常规的逻辑学推理演算具有更大的优势.


    文章目录



    1. 基本原理

    人工神经网络模型的区别主要在 神经网络连接的拓扑结构, 神经元的特征和学习规模等等. 根据神经元连接的拓扑结构的区别, 我们大致可将神经网络模型分为以下两种:


    1. 前向网络

      在前向网络中, 每个神经元只接受前一级的输入并输出到后一级, 在神经网络中没有反馈. 它的拓扑结构可用一个有向无环路图表示. 这种网络所实现的是信号从输入空间到输出空间的变换, 其信息处理能力在于简单非线性函数的有限次复合.

      最简单的前向网络结构是 两层前向网络结构, 该网络只有输入层和输出层. 一般地, 含有一个输入层, 一个输出层和多个中间层的前向神经网络被称为 多层前向网络结构.

    2. 反馈网络
      另一种神经网络模型类型被称为 反馈网络, 这类网络的神经元之间存在反馈, 其拓扑结构可以用一个无向的完备图表示. 其信息处理能力源于状态的变换, 可以用动力系统理论处理. 系统的稳定性和联想记忆功能有密切关系.


    2. 程序设计

    MATLAB 的神经网络工具箱中预置了多种神经网络函数, 包括:

    1. 感知器
    2. 线性网络
    3. BP神经网络
    4. 径向基函数网络
    5. 竞争型神经网络
    6. 自组织网络和学习向量量化网络
    7. 反馈网络

    下面, 对重要的神经网络工具箱函数进行介绍:


    2.1 通用神经网络工具箱函数

    下面介绍数个通用函数的基本功能和用法:

    2.1.1 神经网络初始化函数 init

    利用神经网络初始化函数 init, 我们可对一个现存的神经网络参数进行初始化, 修正这个神经网络的权值, 偏值等参数.
    该函数调用格式为:

    net = init(NET)
    

    其中, NET 是尚未初始化的神经网络, net是经过初始化的神经网络.


    2.1.2 单层神经网络初始化函数 initlay()

    利用函数 initlay(), 我们可对单层神经网络进行初始化, 修正其权值和偏值. 该函数调用格式为:

    net = initlay(NET)
    

    其中, NET 是尚未初始化的神经网络, net是经过初始化的神经网络.


    2.1.3 神经网络单层权值和偏值初始化函数 initwb()

    该函数可对神经网络某一层的权值和偏值进行初始化修正. 调用格式为:

    net = initwb(NET,i)
    

    其中, NET 是尚未初始化的神经网络, net是第 i i i 层经过初始化的神经网络, i 为需要进行权值和偏值修正的目标层数.


    2.1.4 神经网络训练函数 train()

    该通用函数的作用是训练神经网络: 不断重复地将一组输入向量应用于某一个神经网络, 实时更新它的权值和偏值, 当神经网络训练达到所设定的最大学习步长, 最小误差梯度, 误差目标等条件后停止训练. 函数调用格式如下:

    [net,tr,Y,E] = train(NET,X,T,Xi,Ai)
    

    其中:

    1. NET - 受训神经网络
    2. X - 神经网络输入
    3. T - 训练神经网络的目标输出, 默认值为0
    4. Xi - 初始输入延时, 默认值为0
    5. Ai - 初始层延时
    6. net - 完成训练的神经网络
    7. tr - 神经网络训练的步长
    8. Y - 神经网络的输出
    9. E - 神经网络训练误差

    在调用该函数之前, 必须先设定 训练函数, 训练步长, 训练目标误差 等参数. 若没有设定, train 函数将调用默认的训练参数对神经网络进行训练.


    2.1.5 神经网络仿真函数 sim

    该函数的作用是在完成神经网络训练后检测已完成训练的神经网络的性能.其调用格式如下:

    [Y,Xf,Af,E] = sim[net,X,Xi,Ai,T]
    

    其中:

    1. net - 受训神经网络
    2. X - 神经网络输入
    3. Xi - 初始输入延时
    4. Ai - 初始层延时
    5. T - 训练神经网络的目标输出
    6. Y - 神经网络输出
    7. Xf - 最终输入延时
    8. Af - 最终层延时
    9. E - 神经网络训练误差

    2.1.6 神经网络输入的和函数netsum

    该函数通过神经网络的某一层的加权输入和偏值相加,作为该层的输入. 调用格式如下:

    N = netsum({Z1,Z2,...,Zn},FP)
    

    其中, Z n Zn Zn S ∗ Q S*Q SQ 维矩阵.

    [例]

    使用 netsum 函数将两个权值和一个偏值相加:

    z1 = [1 2 4;3 4 1];
    z2 = [-1 2 2;-5 6 1];
    b = [0;-1];
    n = netsum({z1,z2,concur(b,3)})
    

    即得到神经网络输入:

    n =
    
         0     4     6
        -3     9     1
    
    >> 
    

    2.1.7 权值点积函数 dotprod

    dotprod令神经网络的输入向量和权值点积, 可得加权输入. 该函数调用格式如下:

    Z = dotprod(W,P,FP)
    

    其中, W W W 为权值矩阵, P P P 为输入向量, F P FP FP 为可省略的功能参数, Z Z Z 为权值矩阵和输入向量的点积.

    [例]

    使用 dotprod 函数求得一个点积:

    W = rand(4,3);
    P = rand(3,1);
    Z = dotprod(W,P)
    

    即得到点积: (输入变量均为随机生成,实机操作输出结果不定)

    
    Z =
    
        1.1244
        0.7101
        2.3575
        0.1860
    
    >> 
    

    2.1.8 神经网络输入的积函数netprod

    netprod 函数将神经网络某一层甲醛输入和偏值相乘的结果作为该层的输入. 其调用格式为:

    N = netprod({Z1,Z2,...,Zn})
    

    其中, Z n Zn Zn Z ∗ Q Z*Q ZQ 维矩阵.

    [例]

    使用 netprod 函数求得神经网络输入的积:

    Z1 = [1,2,4;3,4,1];
    Z2 = [-1 2 2;-5 -6 1];
    B = [0;-1];
    Z = {Z1,Z2,concur(B,3)};
    N = netprod(Z)
    

    即得到:

    N =
    
         0     0     0
        15    24    -1
    
    >> 
    

    2.2 感知器

    在 MATLAB 神经网络工具箱中有大量和感知器相关的函数. 下面对它们进行简介:


    2.2.1 绘制样本点函数 plotpv

    plotpv 函数可在坐标图中绘出样本点及其类别, 不同类别使用不同的符号. 调用格式如下:

    plotpv(P,T)
    

    其中, P P P n n n 个二维或三维的样本矩阵, T T T 表示各个样本点的类别.


    2.2.2 绘制分类线函数 plotpc

    该函数功能是在已知的样本分类图中绘制出样本分类线. 调用格式如下:

    plotpc(W,B)
    

    其中, W W W B B B 分别是神经网络的权矩阵和偏差向量.


    2.2.3 感知器学习函数 learnp

    learnp 利用感知器学习规则训练单层神经网络. 感知器学习规则是通过调整神经网络的权值和偏值, 使得感受器平均误差和最小, 以便对输入向量进行正确的分类. 该函数的调用格式为:

    [dW,LS] = learnp(P,T,E)
    

    其中, P P P 为输入向量矩阵, T T T 为目标向量, E E E 为误差向量. d W dW dW, L S LS LS 分别为权值和偏值变化矩阵.


    2.2.4 平均绝对误差性能函数 mae

    该函数用于输出神经网络的平均误差. 调用格式为:

    perf = mae(E,Y,X,FP)
    

    其中, E E E 为感知器输出误差矩阵, Y Y Y 表示感知器的输出向量, X X X 表示感知器的权值和偏值向量.


    2.3 线性神经网络函数

    MATLAB 的神经网络工具箱中预置了多种线性神经网络函数. 下面对一些线性神经网络函数进行简介.

    2.3.1 误差平方和性能函数sse

    线性神经网络的学习规则是调整其权值和偏值, 使其误差的 平方和 最小. 误差平方和性能函数的调用格式为:

    perf = sse(net,t,y,ew)
    

    其中, net 为所建立的神经网络, t t t 为目标向量, y y y 为网络输出向量, ew为权值误差, perf 为误差平方和.


    2.3.2 计算线性层最大稳定学习速率函数 maxlinlr

    该函数用于计算使用 Widrow-Hoff 准则所训练出的线性神经网络的最大稳定学习速率. 调用格式如下;

    lr = maxlinlr(P,'bias')
    

    其中, P P P 为输入向量, bias 为神经网络偏值, lr 为学习速率.

    [注]

    一般而言, 学习速率越高, 神经网络所需的训练时间越短, 网络收敛速度越快, 学习效果越不稳定.


    2.3.3 网络学习函数 learnwh

    该函数称为 最小方差准则学习函数. 调用格式如下:

    [dW, LS] = learnwh(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    

    其中:

    1. W - 权值矩阵
    2. P - 输入向量
    3. Z - 权值输入向量
    4. N - 神经网络输入向量
    5. A - 神经网络输出向量
    6. T - 目标向量
    7. E - 误差向量
    8. gW - 权值梯度向量
    9. gA - 输出梯度向量
    10. D - 神经元间隔
    11. LP - 学习函数
    12. LS - 学习状态

    [注]

    dWLS 分别为神经网络的权值和偏值的调整值.

    [例]

    利用 learnwh 函数获取神经网络权值调整值:

    p = rand(2,1);
    e = rand(3,1);
    lp.lr = 0.5;
    dW = learnwh([],p,[],[],[],[],e,[],[],[],lp,[])
    

    代码运行后得到的权值调整值如下:

    dW =
    
        0.0110    0.0519
        0.0338    0.1599
        0.0182    0.0862
    
    >> 
    

    2.3.4 线性神经网络设计函数 newlind

    该函数可设计出可以直接使用的线性神经网络. 调用格式如下;

    net = newlind(P,T,Pi)
    

    其中, P P P 为输入向量, T T T 为目标向量, Pi 为神经元起始状态参数, net 为建立的线性神经网络.

    [例]

    利用 newlind 函数建立一个线性神经网络并测试其性能.

    [解]

    编写代码如下:

    P = {1 2 1 3 3 2};
    Pi = {1 3};
    T = {5.0 6.1 4.0 6.0 6.9 8.0};
    net = newlind(P,T,Pi);
    Y = sim(net,P,Pi)
    

    代码运行结果如下:

    Y =
    
      1×6 cell array
    
        {[4.9824]}    {[6.0851]}    {[4.0189]}    {[6.0054]}    {[6.8959]}    {[8.0122]}
    
    >> 
    

    注:

    在使用 newlind 函数时, 参数 Pi 可以省略.


    2.4 BP神经网络函数

    下面简介一些常用的BP神经网络函数及其基本功能:


    2.4.1 均方误差性能函数 mse

    BP神经网络的学习规则是通过不断调整神经网络的权值和偏值, 从而使得网络输出的均方误差和最小. mse 函数调用格式为:

    perf = mse(net,t,y,ew)
    

    其中, net 为所建立的神经网络, t t t 为目标向量, y y y 为网络输出向量, ew为所有权值和偏值向量, perf 为均方误差.


    2.4.2 误差平方和函数 sumsqr

    sumsqr 函数的作用是计算输入向量平方和. 调用格式为:

    [s,n] = sumsqr(x)
    

    其中, x x x 为输入向量, s s s 为有限值的平方和, n n n 为有限值的个数.


    2.4.3 计算误差曲面函数 errsurf

    该函数的功能是计算单输入神经元输出误差平方和. 调用格式为:

    errsurf(P,T,WV,BV,F)
    

    其中, P P P 为输入向量, T T T 为目标向量, W V WV WV 为权值矩阵, B V BV BV 为偏值矩阵, F F F 为传输函数.


    2.4.4 误差曲面图绘制函数 plotes

    该函数的作用是绘制误差曲面图. 调用格式为:

    plotes(WV,BV,ES,V)
    

    其中, W V WV WV 为权值矩阵, B V BV BV 为偏值矩阵, E S ES ES 为误差曲面, V V V 为期望的视角.

    [例]

    可使用以下代码绘制误差曲面图:

    p = [3 2];
    t = [0.4 0.8];
    wv = -4:0.4:4;
    bv = wv;
    ES = errsurf(p,t,wv,bv,'logsig');
    plotes(wv,bv,ES,[60 30])
    

    所得误差曲面图如下图所示:
    误差曲面图


    2.4.5 误差曲面图权值偏值位置绘制函数 plotep

    该函数的作用是在由函数 plotes 所生成的误差曲面图上绘制出单输入网络权值 W W W 和偏差 B B B 所对应的误差 e e e 的位置. 调用格式为:

    H = plotep(W,B,e)
    

    其中, W W W 为偏值矩阵, B B B 为偏值向量, e e e 为输出误差.

    [例]

    p = [3 2];
    t = [0.4 0.8];
    wv = -4:0.4:4;
    bv = wv;
    ES = errsurf(p,t,wv,bv,'logsig');
    plotes(wv,bv,ES,[60 30])
    W = -3;
    B = 1;
    E = sumsqr(t-sumuff(p,W,B,'logsig'));
    plotep(W,B,e)
    

    运行后即得到权值和偏值在误差曲面上的位置.
    (本飞舞的MATLAB上连sumuff函数都没有,,,哭哭,,,)


    2.5 径向基神经网络函数

    下面简介一些常用的径向基神经网络函数及其功能:


    2.5.1 向量距离计算函数 dist

    大多数神经网络的输入可通过表达式: Y = W ∗ X + B Y = W*X + B Y=WX+B 得到: W , B W, B W,B 分别为神经网络的权向量和偏值向量. 但有些神经元的输入可由函数 dist 计算. 该函数是一个欧式距离权值函数, 它对输入加权以得到被加权的输入. 函数的调用格式如下:

    Z = dist(W,P,FP)
    D = dist(pos)
    

    其中, W W W 为神经网络的权值矩阵, P P P 为输入向量, Z , D Z,D Z,D 均为输出距离矩阵. pos 为神经元位置参数矩阵.

    [例]

    定义一个两层神经网络, 每层神经网络包含三个神经元. 使用函数 dist 计算该神经网络所有神经元之间的距离:

    pos = rand(2,3);
    D = dist(pos)
    

    运行所得结果:

    D =
    
             0    0.6479    1.0356
        0.6479         0    0.7349
        1.0356    0.7349         0
    
    >> 
    

    2.5.2 径向基传输函数 radbas

    该函数作用于径向基神经网络输入矩阵的每一个输入量. 调用格式为:

    A = radbas(N)
    

    其中, N N N 为神经网络的输入矩阵, A A A 为函数的输出矩阵.


    2.5.3 径向基神经网络建立函数 newrb

    newrb 可用于重新创建一个径向基神经网络. 该函数调用格式如下:

    net = newrb(P,T,goal,spread,MN,DF)
    

    其中, P P P 为输入向量, T T T 为目标向量. goal 为均方误差, spread 为径向基函数的扩展速度. M N MN MN 为神经元的最大数目, D F DF DF 为两次显示之间所添加的神经元数目. n e t net net 为生成的径向基神经网络.

    [注]

    利用 newrb 函数建立的径向基神经网络, 也可不经过训练而直接使用.

    [例]

    使用 newrb 建立径向基神经网络, 并实现函数逼近.

    [解]

    编写的代码如下:

    clc;clear all;
    X = 0:0.1:2;               %神经网络输入值
    T = cos(X*pi);             %神经网络目标值
    
    %% 绘制该函数上的采样点
    figure(1)
    plot(X,T,'+');
    title('Sample Points of the Function to be Approximated');
    xlabel = ('Input Values');
    ylabel = ('Target Values');
    
    %% 建立神经网络并进行仿真
    n = -4:0.1:4;
    a1 = radbas(n)
    a2 = radbas(n-1.5);
    a3 = radbas(n+2);
    a = a1 + 1*a2 + 0.5*a3;
    figure(2);
    plot(n,a1,n,a2,n,a3,n,a,'x');
    title('Weighted Sum of Radial Basis Networks');
    xlabel = ('Input Values');
    ylabel = ('Target Values');
    
    % 径向基函数神经网络隐含层中每个神经元的权重和阈值
    % 都指定了相应的径向基函数的位置和宽度. 
    %每一个线性输出神经元都由这些径向基函数的加权和组成.
     
    net = newrb(X,T,0.03,2);   %设定平方和误差参数为0.03
    X1 = 0:0.01:2;
    y = sim(net,X1);
    figure(3);
    plot(X1,y,X,T,'+');
    title('Simulation Result');
    xlabel = ('Input Values');
    ylabel = ('Network & Target Output');
     
    

    程序运行后得到:

    待逼近的函数样本点图形:
    待逼近的函数样本点图形

    建立的径向基传递函数加权和:
    建立的径向基神经网络仿真结果

    建立的径向基神经网络仿真结果:
    建立的径向基神经网络仿真结果

    [注]

    因为径向基神经网络需要更多的隐含层神经元完成训练, 故径向基神经网络不可用于取代其他前馈网络.


    2.5.4 严格径向基神经网络建立函数 newrbe

    建立严格径向基神经网络的函数为 newrbe, 调用格式如下:

    net = newrbe(P,T,speed)
    

    其中, P P P 为输入向量 , T T T 为目标向量, speed 为径向基函数的扩展速度, 默认值为 1 1 1, net 为生成的神经网络.

    [注]

    利用 newrbe 生成的径向基神经网络可不经过训练而直接使用:

    [例]

    在MATLAB 中利用以下代码建立一个径向基神经网络:

    >> P = [1 2 3 4 5 6 7];
    >> T = [8.1 0.8 9.3 6.4 3.6 4.1 1.4];
    >> net = newrbe(P,T);
    >> P = 2;
    >> Y = sim(net, P)
    

    代码执行结果:

    Y =
    
        0.8000
    
    >> 
    

    可见, 所建立的,未经训练的径向基神经网络也正确地预测出了输出值.


    2.5.5 广义回归径向基神经网络函数 newgrnn

    广义回归径向基网络 GRNN 训练速度快, 非线性映射能力强, 常用于函数的逼近. 其调用格式为:

    net = newgrnn(P,T,spread)
    

    其中, P P P 为输入向量, T T T 为目标向量, spread 为径向基函数的扩展速度, 默认值为 1 1 1, net 为所生成的神经网络.

    [注]

    一般而言, spread 取值越小神经网络逼近效果越好, 但逼近过程越不平滑.


    2.5.6 数据索引向量-向量组变换函数 ind2vec

    函数 ind2vec 的作用是对向量进行变换, 将数据索引向量变换为向量组. 调用格式为:

    vec = ind2vec(ind)
    

    其中, ind n n n 维数据索引行向量, vec m m m n n n 列的稀疏矩阵.


    2.5.7 向量组-数据索引向量变换函数 vec2ind

    函数 vec2ind 的作用是对向量进行变换, 将向量组变换为数据索引向量, 可视为ind2vec 的逆操作函数. 其调用格式为:

    ind = vec2ind(vec)
    

    其中, ind n n n 维数据索引行向量, vec m m m n n n 列的稀疏矩阵.


    2.5.8 概率径向基函数 newpnn

    该函数命令用于建立概率径向基神经网络, 具有训练速度快, 结构简单的特点, 适合解决模式分类问题. 函数调用格式如下:

    net = newpnn(P,T,spread)
    

    其中, P P P 为输入向量, T T T 为目标向量, spread 为径向基函数的扩展速度, net 为所生成的神经网络.

    [注]

    该函数生成的神经网络和严格径向基神经网络建立函数 newrbe 所建立的神经网络一样, 可以不经过训练而直接使用.

    [例]

    建立一个概率径向基神经网络并进行仿真:

    P = [1 2 3 4 5 6 7 8];
    Tc = [1 1 4 5 1 4 1 9];
    T = ind2vec(Tc)     %将类别向量转换为可使用的目标向量组
    net = newpnn(P,T);
    Y = sim(net,P)
    Yc = vec2ind(Y)     %将仿真结果转换为类别向量
    

    所得结果如下:

    
    T =
    
       (1,1)        1
       (1,2)        1
       (4,3)        1
       (5,4)        1
       (1,5)        1
       (4,6)        1
       (1,7)        1
       (9,8)        1
    
    
    Y =
    
         1     1     0     0     1     0     1     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     1     0     0     1     0     0
         0     0     0     1     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     1
    
    
    Yc =
    
         1     1     4     5     1     4     1     9
    
    >> 
    

    2.6 自组织神经网络函数

    下面简介一些常用的自组织神经网络函数及其功能:


    2.6.1 竞争神经网络建立函数 newc

    函数newc 可用于建立一个竞争型神经网络. 其调用格式为:

    net = newc(P,S)
    

    其中, P P P 为决定输入列向量最大最小值取值范围的矩阵, S S S 表示神经网络中神经元的个数, net 表示建立的竞争神经网络.

    [例]

    建立并训练一个竞争型神经网络:

    P = [1 9 1 9 ;1 1 4 5];
    net = newc([-1 1;-1 1],3);
    net = train(net,P);
    y = sim(net,P);
    yc = vec2ind(y)
    

    所得结果:

    
    Y =
    
         1     1     0     0     1     0     1     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     1     0     0     1     0     0
         0     0     0     1     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     1
    
    
    Yc =
    
         1     1     4     5     1     4     1     9
    
    >> jingzhengxingshenjingwanglnewc
    
    yc =
    
         1     2     3     2
    
    >> 
    

    竞争型神经网络训练如下图所示:
    竞争型神经网络训练示意图


    2.6.2 竞争传输函数 compet

    compet 函数可对竞争神经网络的输入进行转换, 使得网络中有最大输入值的神经元的输出为 1 1 1, 且其余神经元的输出为 0 0 0. 调用格式如下:

    A = compet(N)
    

    其中, A A A 为输出向量矩阵, N N N 为输入向量.


    2.6.3 一定类别的样本向量生成函数 nngenc

    函数调用格式如下:

    x = nngenc(bounds, clusters, points, std_dev)
    

    其中, x x x 是具有一定类别的样本向量, bounds 指类中心的范围, clusters 指类别数目, points 指每一类的样本点数目, std_dev 指每一类样本点的标准差.

    [例]

    %创建输入样本向量
    bounds = [0,1;0,1];  %类中心的范围
    clusters = 5;        %类的个数
    points = 14;         %每个类的点数
    std_dev = 0.05;      %每个样本点的标准差
    x = nngenc(bounds, clusters, points, std_dev)
    
    %%绘制输入样本的样本向量图
    plot(x(1,:),x(2:,),'+'r);
    title('Imput Vectors');
    xlabel('x(1)');
    ylabel('x(2)');
    

    程序运行结果如下图所示:

    (然而本飞舞的MATLAB上这个函数也没有,,,)


    2.6.4 自组织网络权值向量绘制函数 plotsum

    该函数的作用是在神经网络的每个神经元权向量对应坐标处画点, 并用实线连接起神经元权值点. 调用格式如下:

    plotsum(pos)
    

    其中, pos 是表示 N N N 维坐标点的 N ∗ S N*S NS 维矩阵.


    2.6.5 Kohonen 权值学习规则函数 learnk

    learnk 函数根据 Kohonen 准则计算神经网络的权值变化矩阵. 调用格式如下:

    [dW,LS] = learnk(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    

    其中:

    1. dW - 权值变化矩阵
    2. LS - 新的学习状态
    3. W - 权值矩阵
    4. P - 输入向量
    5. Z - 权值输入向量
    6. N - 神经网络输入向量
    7. T - 目标向量
    8. E - 误差向量
    9. gW - 性能参数梯度
    10. gA - 性能参数的输出梯度
    11. LP - 学习速率 (默认为0.01)
    12. LS - 学习状态

    2.6.6 Hebb 权值学习规则函数 learnh

    learnh 函数的原理是 Δ ω ( i , j ) = η ∗ y ( i ) ∗ x ( j ) . \Delta \omega(i,j) = \eta * y(i)*x(j). Δω(i,j)=ηy(i)x(j). 即第 j j j 个输入和第 i i i 个神经元之间的权值变化量神经元输入和输出的乘积成正比. 调用格式如下:

    [dW,LS] = learnh(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    

    其中,函数各变量含义和 learnk 函数中的完全一致.


    2.6.7 输入向量加权值计算函数 negdist

    函数调用格式如下:

    Z = negdist(W,P)
    

    其中, Z Z Z 为负向量距离矩阵, W W W 为权值函数, P P P 为输入矩阵.


    中, `pos` 是表示 $N$ 维坐标点的 $N*S$ 维矩阵.

    2.6.5 Kohonen 权值学习规则函数 learnk

    learnk 函数根据 Kohonen 准则计算神经网络的权值变化矩阵. 调用格式如下:

    [dW,LS] = learnk(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    

    其中:

    1. dW - 权值变化矩阵
    2. LS - 新的学习状态
    3. W - 权值矩阵
    4. P - 输入向量
    5. Z - 权值输入向量
    6. N - 神经网络输入向量
    7. T - 目标向量
    8. E - 误差向量
    9. gW - 性能参数梯度
    10. gA - 性能参数的输出梯度
    11. LP - 学习速率 (默认为0.01)
    12. LS - 学习状态

    2.6.6 Hebb 权值学习规则函数 learnh

    learnh 函数的原理是 Δ ω ( i , j ) = η ∗ y ( i ) ∗ x ( j ) . \Delta \omega(i,j) = \eta * y(i)*x(j). Δω(i,j)=ηy(i)x(j). 即第 j j j 个输入和第 i i i 个神经元之间的权值变化量神经元输入和输出的乘积成正比. 调用格式如下:

    [dW,LS] = learnh(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    

    其中,函数各变量含义和 learnk 函数中的完全一致.


    2.6.7 输入向量加权值计算函数 negdist

    函数调用格式如下:

    Z = negdist(W,P)
    

    其中, Z Z Z 为负向量距离矩阵, W W W 为权值函数, P P P 为输入矩阵.


    3. 常见应用

    神经网络是由人工基本神经元相互连接, 模拟人脑神经处理信息方式解决问题的工具. 神经网络可以解决很多利用传统方法无法解决的问题.

    3.1 BP神经网络

    BP神经网络具有很强的 映射能力, 主要应用有: 模式识别分类, 函数逼近, 函数压缩 等.

    [例]函数逼近:
    设计一个 BP 神经网络, 逼近函数 g ( x ) = 1 + s i n ( k π 2 x ) . g(x) = 1+sin(\frac{k\pi}{2x}). g(x)=1+sin(2xkπ). 其中, 分别令 k = 2 , 3 , 6 k = 2,3,6 k=2,3,6 进行仿真, 通过调节参数得出信号频率和隐含层节点之间, 隐含层节点与函数逼近能力之间的关系.

    [解]
    设频率参数 k = 2 k=2 k=2, 绘制要毕竟的非线性函数的目标曲线:

    k = 2;p = [-1:.05:8];
    t = 1+sin(k*pi/2*p);
    plot(p,t,'-');
    title('Non-linear Function to be Approached');
    xlabel = ('Time');
    ylabl = ('Non-linear Function');
    

    运行后得到目标曲线如下图所示:
    逼近的非线性函数曲线
    使用 newff 函数建立BP神经网络:

    n = 5;          %设定隐含层神经元数目为5
    net = newff(minmax(p),[n,1],{'tansig','purelin'},'trainlm');
    %选择隐含层和输出层神经元传递函数为 tansig 和 purelin,
    %网络训练算法采用 Levenberg-Marquardt 算法 trainlm.
    %对于初始神经网络, 可使用 sim() 函数观察网络输出
    y1 = sim(net,p);
    figure;
    plot(p,t,'-',p,y1,':')
    title('Raw Output');
    xlabel('Time');
    ylabel('Simulation Output----Original Function')
    

    程序运行后所得到的神经网络输出曲线和原函数的对比图:
    神经网络输出曲线和原函数的对比图

    使用 newff 函数建立神经网络时权值和阈值的初始化是随机的, 故网络输出的结构很差, 达不到逼近函数的目的.
    下面设置网络训练参数, 应用 train 函数对网络进行训练:

    net = trainParam.epochs = 200;  %设定网络训练步长为200
    net.trainParam.goal = 0.2;      %设定网络训练精度为0.2
    net = train(net,p,t);           %开始执行网络训练
    

    训练过程中的误差变化状态如下图所示:
    训练过程中误差变化过程

    下面对训练出的神经网络进行仿真:

    y2 = sim(net,p);
    figure;
    plot(p,t,'-',p,y1,':',p,y2,'--')
    title('Output of the Trained Neural Network');
    xlabel('Time')ylabel('Simulation Output')
    

    下图为训练所得的神经网络的输出结果:
    训练所得的神经网络的输出结果
    不难看出, 经过训练后的 BP 神经网络对非线性函数的逼近效果有显著提升.

    实际上, 改变非线性函数的频率和 BP 神经网络隐含层神经元的数目, 也会对神经网络逼近函数的效果有一定影响. 一般而言, 隐含层神经元数目越多, BP 网络逼近非线性函数的能力越强.

    展开全文
  • 人工神经网络是一种模仿人脑结构及其功能的信息处理系统 能提高人们对信息处理的 智能化水平它是一门新兴的边缘和交叉学科它在理论模型 算法等方面比起以前有了 较大的发展但至今无根本性的突破还有很多空白点需要...
  • 神经网络算法

    千次阅读 2015-10-23 14:38:18
    神经网络算法  锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核。 逻辑性的思维是指根据逻辑规则进行推理的过程;它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理...
  • 神经网络算法是数据拟合算法

    千次阅读 2017-09-04 19:48:37
    刚刚在看一篇名为《中国人口增长模型》的数学建模论文时,同时最近人工智能又处于风口上,所以就想能不能将神经网络算法应用到时间序列型的模型上,当经过一会的思考否决了这个算法,因为神经网络算法是属于数据拟合...
  • 该程序是根据《人工智能》教材中一个小示例编写的神经网络程序。实现权值的调节。
  • 基于神经网络算法的机坪智能识别系统.pdf
  • BP 算法 这是第一次尝试在csdn上写blog,主要因为我也是刚刚接触人工智能,所以各方面都在尝试中,所以想通过这种方式以讲代学,内...sigmoid 函数是人工智能神经网络中最常使用的一类激活函数,其数学表达式为: ...
  • Google搜索引擎的核心_PageRank算法综述 人工神经网络算法在数据挖掘中的应用
  • 基于深度学习的神经网络算法论文基于深度学习的神经网络算法论文基于深度学习的神经网络算法论文
  • 基于神经网络算法智能抗干扰系统设计.pdf
  • 基于神经网络算法的粮食智能控制系统研究.pdf
  • 人工神经网络算法简介

    万次阅读 2008-01-02 16:58:00
    人工神经网络简介(算法课程论文) 西安电子科技大学软件学院130513班 黎建文 13051234 摘要 “人工神经网络”这个词汇对不少人来说并不新鲜,但是它的内涵,原理对很多人来说并不清楚。本文试图对人工神经网络及其...
  • 本文实例讲述了Python实现的NN神经网络算法。分享给大家供大家参考,具体如下: 参考自Github开源代码:https://github.com/dennybritz/nn-from-scratch 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所...
  • 3.BP神经网络算法设计与实现.pdf 同样和我上传的别的算法一样都是mfc实现步骤和核心代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,096
精华内容 44,038
关键字:

人工智能神经网络算法