《2022年2022年简单分析神经网络与matlab .pdf》由会员分享,可在线阅读,更多相关《2022年2022年简单分析神经网络与matlab .pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、神经网络与matlab没有什么难度希望可以帮助需要的同学第0节、引例本文以 Fisher 的 Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在 http:/en.wikipedia.org/wiki/Iris_flower_data_set 找到。这里简要介绍一下 Iris数据集:有一批 Iris花,已知这批 Iris花可分为 3个品种,现需要对其进行分类。不同品种的 Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度会有差异。我们现有一批已知品种的Iris花的花萼长度、 花萼宽度、 花瓣长度、 花瓣宽度的数据。一种解决方法是用已有的数据训练一个神经网络用作分类器。如果你只想用
2、 C# 或 Matlab 快速实现神经网络来解决你手头上的问题,或者已经了解神经网络基本原理,请直接跳到第二节神经网络实现。第一节、神经网络基本原理1. 人工神经元 (Artificial Neuron )模型人工神经元是神经网络的基本元素,其原理可以用下图表示:图1. 人工神经元模型图中nxx 1是从其他神经元传来的输入信号,Wij 表示表示从神经元 j 到神经元i 的连接权值 , 表示一个阈值 ( threshold ),或称为偏置 ( bias )。则神经名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
3、 - - - - - 第 1 页,共 18 页 - - - - - - - - - 元 i 的输出与输入的关系表示为:图中 yi 表示神经元 i 的输出, 函数 f 称为激活函数 ( Activation Function )或转移函数 ( Transfer Function ) ,net 称为净激活 (net activation)。若将阈值看成是神经元i 的一个输入 x0的权重 wi0,则上面的式子可以简化为:若用 X表示输入向量 ,用 W表示权重向量,即 :X = x0 , x1 , x2 , . , xn 则神经元的输出可以表示为向量相乘的形式:若神经元的净激活net 为正,称该神经元
4、处于激活状态或兴奋状态(fire),若净激活 net 为负,则称神经元处于抑制状态。图1中的这种“阈值加权和”的神经元模型称为M-P 模型 ( McCulloch-Pitts Model ) ,也称为神经网络的一个 处理单元 ( PE, Processing Element )。2. 常用激活函数激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - (1) 线
5、性函数 ( Liner Function )(2) 斜面函数 ( Ramp Function )(3) 阈值函数 ( Threshold Function )以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数。(4) S 形函数 ( Sigmoid Function )该函数的导函数:(5) 双极 S形函数该数函的导函数:S形函数与双极 S形函数的图像如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - 图3.
6、S 形函数与双极 S形函数图像双极 S 形函数与 S 形函数主要区别在于函数的值域,双极S 形函数值域是(-1,1),而 S形函数值域是 (0,1) 。由于 S形函数与双极 S形函数都是可导的 (导函数是连续函数 ), 因此适合用在 BP神经网络中。(BP算法要求激活函数可导 )3. 神经网络模型神经网络是由大量的神经元互联而构成的网络。根据网络中神经元的互联方式,常见网络结构主要可以分为下面类:(1) 前馈神经网络( Feedforward Neural Networks )前馈网络也称前向网络。 这种网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送, 直到到达输出层, 层间没有
7、向后的反馈信号, 因此被称为前馈网络。感知机 ( perceptron)与 BP神经网络就属于前馈网络。图4 中是一个 3层的前馈神经网络, 其中第一层是输入单元, 第二层称为隐含层,第三层称为输出层(输入单元不是神经元,因此图中有2层神经元)。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - 图4. 前馈神经网络对于一个 3层的前馈神经网络N ,若用 X表示网络的输入向量, W1W3表示网络各层的连接权向量, F1F3表示神经
8、网络 3层的激活函数。那么神经网络的第一层神经元的输出为:O1 = F1( XW1 )第二层的输出为:O2 = F2 ( F1( XW1 ) W2 )输出层的输出为:O3 = F3( F2 ( F1( XW1 ) W2 ) W3 )若激活函数 F1F3 都选用线性函数,那么神经网络的输出O3 将是输入 X的线性函数。因此,若要做高次函数的逼近就应该选用适当的非线性函数作为激活函数。(2) 反馈神经网络( Feedback Neural Networks )反馈型神经网络是一种从输出到输入具有反馈连接的神经网络,其结构比前馈网络要复杂得多。典型的反馈型神经网络有:Elman网络和 Hopfiel
9、d网络。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 18 页 - - - - - - - - - 图5. 反馈神经网络(3) 自组织网络( SOM ,Self-Organizing Neural Networks )自组织神经网络是一种无导师学习网络。它通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。图6. 自组织网络4. 神经网络工作方式神经网络运作过程分为学习和工作两种状态。名师资料总结 - - -精品资料欢迎下载 - - - - -
10、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - (1) 神经网络的学习状态网络的学习主要是指使用学习算法来调整神经元间的联接权,使得网络输出更符合实际。学习算法分为有导师学习( Supervised Learning )与无导师学习( Unsupervised Learning )两类。有导师学习 算法将一组训练集 ( training set )送入网络,根据网络的实际输出与期望输出间的差别来调整连接权。有导师学习算法的主要步骤包括:1) 从样本集合中取一个样本(Ai,Bi ) ;2)
11、 计算网络的实际输出O ;3) 求 D=Bi-O;4) 根据 D调整权矩阵 W ;5) 对每个样本重复上述过程,直到对整个样本集来说,误差不超过规定范围。BP算法就是一种出色的有导师学习算法。无导师学习 抽取样本集合中蕴含的统计特性, 并以神经元之间的联接权的形式存于网络中。Hebb学习律是一种经典的无导师学习算法。(2) 神经网络的工作状态神经元间的连接权不变,神经网络作为分类器、预测器等使用。下面简要介绍一下Hebb学习率与 Delta 学习规则。(3) 无导师学习算法: Hebb学习率Hebb 算法核心思想是,当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。为了理解 H
12、ebb算法,有必要简单介绍一下条件反射实验。巴甫洛夫的条件反射实验:每次给狗喂食前都先响铃,时间一长,狗就会将铃声和食物联系起来。以后如果响铃但是不给食物,狗也会流口水。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - 图7. 巴甫洛夫的条件反射实验受该实验的启发, Hebb 的理论认为在同一时间被激发的神经元间的联系会被强化。比如,铃声响时一个神经元被激发,在同一时间食物的出现会激发附近的另一个神经元, 那么这两个神经元间的联
13、系就会强化,从而记住这两个事物之间存在着联系。 相反,如果两个神经元总是不能同步激发,那么它们间的联系将会越来越弱。Hebb学习律可表示为:其中 wij 表示神经元 j 到神经元 i 的连接权, yi 与 yj 为两个神经元的输出, a是表示学习速度的常数。若yi 与 yj 同时被激活,即yi 与 yj 同时为正,那么Wij 将增大。若 yi 被激活,而 yj 处于抑制状态,即yi 为正 yj 为负,那么 Wij将变小。(4) 有导师学习算法: Delta 学习规则Delta 学习规则是一种简单的有导师学习算法,该算法根据神经元的实际输出与期望输出差别来调整连接权,其数学表示如下:其中 Wij
14、 表示神经元 j 到神经元 i 的连接权, di 是神经元 i 的期望输出, yi 是神经元 i 的实际输出, xj 表示神经元 j 状态,若神经元 j 处于激活态则 xj 为1,若处于抑制状态则xj 为0或1 (根据激活函数而定)。 a 是表示学习速度的常数。假设 xi 为1,若 di 比 yi 大,那么 Wij 将增大,若 di 比 yi 小,那么 Wij 将变小。Delta 规则简单讲来就是:若神经元实际输出比期望输出大,则减小所有输入为名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
15、- 第 8 页,共 18 页 - - - - - - - - - 正的连接的权重, 增大所有输入为负的连接的权重。反之,若神经元实际输出比期望输出小, 则增大所有输入为正的连接的权重,减小所有输入为负的连接的权重。这个增大或减小的幅度就根据上面的式子来计算。(5) 有导师学习算法: BP算法采用 BP学习算法的前馈型神经网络通常被称为BP网络。图8. 三层 BP神经网络结构BP网络具有很强的非线性映射能力,一个3层 BP神经网络能够实现对任意非线性函数进行逼近(根据Kolrnogorov定理) 。一个典型的 3层 BP神经网络模型如图 7所示。BP网络的学习算法占篇幅较大,我打算在下一篇文章中
16、介绍。第二节、神经网络实现1. 数据预处理在训练神经网络前一般需要对数据进行预处理,一种重要的预处理手段是归一化处理。下面简要介绍归一化处理的原理与方法。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18 页 - - - - - - - - - (1) 什么是归一化?数据归一化,就是将数据映射到0,1或 -1,1区间或更小的区间,比如(0.1,0.9) 。(2) 为什么要归一化处理?输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
17、数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于 S形函数的值域限制在 (0,1) ,也就是说神经网络的输出只能限制在(0,1) ,所以训练数据的输出就要归一化到0,1 区间。S形激活函数在 (0,1) 区间以外区域很平缓, 区分度太小。 例如 S形函数 f(X)在参数 a=1时,f(100) 与 f(5) 只相差 0.0067。(3) 归一化算法一种简单而快速的归一化算法是线性转换算法。线性转换算法常见有两种形式:y =
18、 ( x - min )/( max - min )其中 min 为 x 的最小值, max为 x 的最大值,输入向量为x,归一化后的输出向量为 y 。上式将数据归一化到 0 , 1 区间,当激活函数采用S 形函数时(值域为 (0,1) )时这条式子适用。y = 2 * ( x - min ) / ( max - min ) - 1这条公式将数据归一化到 -1 , 1 区间。当激活函数采用双极S形函数(值域为(-1,1))时这条式子适用。(4) Matlab数据归一化处理函数Matlab 中归一化处理数据可以采用premnmx , postmnmx , tramnmx 这3个函数。 premn
19、mx语法: pn,minp,maxp,tn,mint,maxt = premnmx(p,t)参数:pn: p 矩阵按行归一化后的矩阵minp,maxp :p 矩阵每一行的最小值,最大值名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 18 页 - - - - - - - - - tn :t 矩阵按行归一化后的矩阵mint ,maxt:t 矩阵每一行的最小值,最大值作用:将矩阵 p,t 归一化到 -1,1 ,主要用于归一化处理训练数据集。 tramnmx语法: pn = t
20、ramnmx(p,minp,maxp)参数:minp,maxp :premnmx函数计算的矩阵的最小,最大值pn:归一化后的矩阵作用:主要用于归一化处理待分类的输入数据。 postmnmx语法: p,t = postmnmx(pn,minp,maxp,tn,mint,maxt)参数:minp,maxp :premnmx函数计算的 p 矩阵每行的最小值,最大值mint ,maxt:premnmx函数计算的 t 矩阵每行的最小值,最大值作用:将矩阵 pn,tn 映射回归一化处理前的范围。postmnmx函数主要用于将神经网络的输出结果映射回归一化前的数据范围。2. 使用 Matlab 实现神经网络
21、使用 Matlab 建立前馈神经网络主要会使用到下面3个函数:newff :前馈网络创建函数train :训练一个神经网络sim :使用网络进行仿真下面简要介绍这 3个函数的用法。(1) newff函数newff 函数语法newff 函数参数列表有很多的 可选参数, 具体可以参考Matlab 的帮助文档,这里介绍 newff 函数的一种简单的形式。语法:net = newff ( A, B, C ,trainFun )参数:A:一个 n2的矩阵,第 i 行元素为输入信号xi 的最小值和最大值;B:一个 k 维行向量,其元素为网络中各层节点数;C:一个 k 维字符串行向量,每一分量为对应层神经元
22、的激活函数 ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 18 页 - - - - - - - - - trainFun :为学习规则采用的 训练算法 。常用的激活函数常用的激活函数有:a)线性函数 (Linear transfer function)f(x) = x该函数的字符串为 purelin 。b) 对数 S形转移函数 ( Logarithmic sigmoid transfer function )该函数的字符串为 logsig 。c) 双曲正切 S形函数
23、 (Hyperbolic tangent sigmoid transfer function )也就是上面所提到的双极S形函数。该函数的字符串为 tansig 。Matlab 的安装目录下的 toolboxnnetnnetnntransfer子目录中有所有激活函数的定义说明。常见的训练函数常见的训练函数有:traingd :梯度下降 BP训练函数 (Gradient descent backpropagation)traingdx :梯度下降自适应学习率训练函数网络配置参数一些重要的网络配置参数如下:net.trainparam.goal :神经网络训练的目标误差net.trainparam.
24、show : 显示中间结果的周期net.trainparam.epochs :最大迭代次数net.trainParam.lr : 学习率(2) train函数网络训练学习函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 18 页 - - - - - - - - - 语法: net, tr, Y1, E = train( net, X, Y )参数:X:网络实际输入Y:网络应有输出tr :训练跟踪信息Y1:网络实际输出E:误差矩阵(3) sim函数语法: Y=sim(
25、net,X)参数:net :网络X:输入给网络的N 矩阵,其中 K为网络输入个数, N为数据样本数Y:输出矩阵 Q N ,其中 Q为网络输出个数(4) Matlab BP网络实例我将 Iris数据集分为 2组,每组各 75个样本,每组中每种花各有 25个样本。其中一组作为以上程序的训练样本,另外一组作为检验样本。为了方便训练,将3类花分别编号为 1,2,3 。使用这些数据训练一个 4输入(分别对应 4个特征) ,3输出(分别对应该样本属于某一品种的可能性大小)的前向网络。Matlab 程序如下:%读取训练数据f1,f2,f3,f4,class = textread(trainData.txt
26、, %f%f%f%f%f,150); %特征值归一化input,minI,maxI = premnmx( f1 , f2 , f3 , f4 ) ; %构造输出矩阵s = length( class) ; output = zeros( s , 3 ) ; for i = 1 : s output( i , class( i ) ) = 1 ; end %创建神经网络net = newff( minmax(input) , 10 3 , logsig purelin , traingdx ) ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
27、- - - - 名师精心整理 - - - - - - - 第 13 页,共 18 页 - - - - - - - - - %设置训练参数net.trainparam.show = 50 ; net.trainparam.epochs = 500 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ; %开始训练net = train( net, input , output ) ; %读取测试数据t1 t2 t3 t4 c = textread(testData.txt , %f%f%f%f%f,150); %测试数据归一化testI
28、nput = tramnmx ( t1,t2,t3,t4 , minI, maxI ) ; %仿真Y = sim( net , testInput ) %统计识别正确率s1 , s2 = size( Y ) ; hitNum = 0 ; for i = 1 : s2 m , Index = max( Y( : , i ) ) ; if( Index = c(i) ) hitNum = hitNum + 1 ; end end sprintf( 识别率是%3.3f%,100 * hitNum / s2 ) 以上程序的识别率稳定在95% 左右,训练100次左右达到收敛, 训练曲线如下图所示:名师资
29、料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 18 页 - - - - - - - - - 图9. 训练性能表现(5) 参数设置对神经网络性能的影响我在实验中通过调整隐含层节点数, 选择不通过的激活函数, 设定不同的学习率,隐含层节点个数隐含层节点的个数对于识别率的影响并不大,但是节点个数过多会增加运算量,使得训练较慢。激活函数的选择激活函数无论对于识别率或收敛速度都有显著的影响。在逼近高次曲线时,S形函数精度比线性函数要高得多,但计算量也要大得多。学习率的选择学习率影响着
30、网络收敛的速度, 以及网络能否收敛。 学习率设置偏小可以保证网络收敛,但是收敛较慢。相反,学习率设置偏大则有可能使网络训练不收敛,影响识别效果。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 18 页 - - - - - - - - - 3. 使用 AForge.NET实现神经网络(1) AForge.NET 简介AForge.NET 是一个 C#实现的面向人工智能、计算机视觉等领域的开源架构。AForge.NET源代码下的 Neuro 目录包含一个神经网络的类库。AF
31、orge.NET主页: http:/ http:/ 工程的类图如下:图10. AForge.Neuro类库类图下面介绍图 9中的几个基本的类:Neuron 神经元的抽象基类Layer 层的抽象基类,由多个神经元组成Network 神经网络的抽象基类,由多个层(Layer)组成IActivationFunction - 激活函数( activation function)的接口名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 18 页 - - - - - - - - - I
32、UnsupervisedLearning - 无导师学习( unsupervised learning)算法的接口ISupervisedLearning - 有导师学习( supervised learning)算法的接口(2) 使用 Aforge 建立 BP神经网络使用 AForge 建立 BP神经网络会用到下面的几个类: SigmoidFunction : S 形神经网络构造函数: public SigmoidFunction( double alpha )参数 alpha 决定 S形函数的陡峭程度。 ActivationNetwork :神经网络类构造函数:public Activati
33、onNetwork( IActivationFunction function, int inputsCount, params int neuronsCount ): base( inputsCount, neuronsCount.Length )public virtual double Compute( double input )参数意义:inputsCount :输入个数neuronsCount :表示各层神经元个数 BackPropagationLearning:BP学习算法构造函数:public BackPropagationLearning( ActivationNetwork
34、 network )参数意义:network :要训练的神经网络对象BackPropagationLearning类需要用户设置的属性有下面2个:learningRate :学习率momentum :冲量因子下面给出一个用 AForge 构建 BP网络的代码。/ 创建一个多层神经网络,采用S 形激活函数,各层分别有4,5,3 个神经元 /(其中 4 是输入个数, 3 是输出个数, 5 是中间层结点个数) ActivationNetwork network = new ActivationNetwork( new SigmoidFunction(2), 4, 5, 3); / 创建训练算法对象B
35、ackPropagationLearning teacher = new BackPropagationLearning(network); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 18 页 - - - - - - - - - / 设置 BP 算法的学习率与冲量系数teacher.LearningRate = 0.1; teacher.Momentum = 0; int iteration = 1 ; / 迭代训练500 次while( iteration 500 ) teacher.RunEpoch( trainInput , trainOutput ) ; +iteration ; /使用训练出来的神经网络来分类,t 为输入数据向量network.Compute(t)0 改程序对 Iris 数据进行分类,识别率可达97% 左右 。神经网络编程_源代码 .rar名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 18 页 - - - - - - - - -
限制150内