文档库 最新最全的文档下载
当前位置:文档库 › BP神经网络算法原理

BP神经网络算法原理

BP神经网络算法原理
BP神经网络算法原理

BP网络模型处理信息的基本原理是:输入信号X i通过中间节点(隐层点)作用

于输出节点,经过非线形变换,产生输出信号Y k,网络训练的每个样本包括输

入向量X和期望输出量t,网络输出值丫与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值W ij和隐层节点与输出节点之间的联接强度T jk 以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。

一BP 神经网络模型

BP 网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。( 1)节点输出模型

隐节点输出模型:O j=f( D W ij x X i-q j) (1)

输出节点输出模型:Y k=f( E T jk X O j-q k) (2)

f-非线形作用函数;q -神经单元阈值。

( 2)作用函数模型作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1)内连续取值Sigmoid 函

数:f(x)=1/(1+e -x) ( 3)

( 3)误差计算模型误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数:

E p=1/2 X^t pi-O pi)2(4)

t pi- i 节点的期望输出值;O pi-i 节点计算输出值。

(4)自学习模型

神经网络的学习过程,即连接下层节点和上层节点之间的权重拒阵W ij 的设定和误差修正过程。BP 网络有师学习方式-需要设定期望值和无师学习方式-只需输入模式之分。自学习模型为

ZW ij(n+1)= h x 宙x O j+a x/W ij(n) (5)

h -学习因子;①i-输出节点i的计算误差;O j-输出节点j的计算输出;a-动量因子。二BP 网络模型的缺陷分析及优化策略

(1)学习因子h 的优化

采用变步长法根据输出误差大小自动调整学习因子,来减少迭代次数和加快收敛速度。

h =h +a x(E p(n)- E p(n-i))/ E p(n)a 为调整步长,0~1 之间取值 (6)

( 2)隐层节点数的优化

隐节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学习时间过长,甚至不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析法并进行参数的显著性检验来动态删除一些线形相关的隐节点,节点删除标准:当由该节点出发指向下一层节点的所有权值和阈值均落于死区

(通常取土0.1 >±0.05等区间)之中,则该节点可删除。最佳隐节点数L可参

考下面公式计算:

L=(m+n) 1/2+c (7)

m-输入节点数;n-输出节点数;c-介于1?10的常数。

(3)输入和输出神经元的确定

利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。

(4)算法优化

由于BP 算法采用的是剃度下降法,因而易陷于局部最小并且训练时间较长。用基于生物免疫机制地既能全局搜索又能避免未成熟收敛的免疫遗传算法IGA 取代传统BP 算法来克服此缺点。

该程序实现神经网络的BP 算法,输入节点数,输出节点数,隐层数,隐层节点数任意,由用户决定。其中隐层数指的是总共曾数包含输出层,比如说异或算法为2 层,第一层节点数为2,第二层也即输出层节点数为1,输入点数为2 。但是该程序对异或算法实现并不理想,对多层多节点的神经网络有较好的结果。#include "iostream.h"

#include

#include

#include

#include

#include "stdio.h "

#define MAXCOUNT 1e5 // 迭代训练次数上限

// 精度0.001 的随机浮点数,范围在-0.5 ——0.5

float randf()

{

return (float)((rand() % 1001) * 0.001f-0.5);

}

// 高斯随机数产生函数

double gaussrand()

{ static double V1, V2, S;

static int phase = 0;

double X;

if(phase == 0) {

do {

double U1 = (double)rand() / RAND_MAX;

double U2 = (double)rand() / RAND_MAX;

V1 = 2 * U1 - 1;

V2 = 2 * U2 - 1;

S = V1 * V1 + V2 * V2;

} while(S >= 1 || S == 0);

X = V1 * sqrt(-2 * log(S) / S);

} else

X = V2 * sqrt(-2 * log(S) / S);

phase = 1 - phase;

return X;

}

// 定义一个多层前向BP 网络

class BP

{public:

double ***p;// 记录所有的权值

double ***ddp;// 记录所有的权值增量

int *pnode;// 记录每一层的节点数

double **pnodey;// 记录每组每一层的节点的输出值double **ddlj;// 记录每组每一层的节点的ddlj double **pX;// 记录输入样本

double **pY;// 记录输入理想输出值

int Sidenum;

int Inputnodenum;

int outputnodenum;

int yangbenzushu;

BP()

{ Sidenum=0;

Inputnodenum=0;

outputnodenum=0;

yangbenzushu=0;}

~BP()

{

for(int m=0;m

{

for(int n=0;n

{delete[] p[m][n];

delete[] ddp[m][n];}

delete[] p[m];

delete[] ddp[m];

}

delete[] p;

delete[] ddp;

p=NULL;

ddp=NULL;

if(p==NULL)

delete [] pnode;

for(int M=0;M

{delete[] pnodey[M];

delete[] ddlj[M];

}

delete[] pnodey;

delete[] ddlj;

pnodey=NULL;

ddlj=NULL;

}

// 完成所有权值的初始化

void getW(int sidenum,int inputnodenum,int outputnodenum1,int yangbenzu) { Sidenum=sidenum;

yangbenzushu= yangbenzu;

Inputnodenum=inputnodenum; outputnodenum=outputnodenum1; p=new double **[sidenum]; ddp=new double **[sidenum]; pnode=new int [sidenum+1];// 包含输入层输出层每一层的节点数for(int i=0;i

{

int data=0;

cout<<" 请输入第"<

cin>>data;

pnode[i]=data;

}

for (int j=0;j

{ p[j]=new double* [pnode[j+1]];

ddp[j]=new double*[pnode[j+1]];

for (int k=0;k

{ ddp[j][k]=new double[pnode[j]+1];

p[j][k]=new double[pnode[j]+1];

for (int t=0;t

{ ddp[j][k][t]=0;// 每一层的权值初始化为0

if(t==0)p[j][k][t]=-fabs(randf());// 每一层的阀值初始化

else p[j][k][t]=randf();// 每一层的权值初始化

}

}

}

// 为记录每一层的节点的输出值和ddlj 的指针开辟内存pnodey=new double *[Sidenum];

ddlj=new double *[Sidenum];

for(int p=0;p

{

pnodey[p] = new double [pnode[p+1]+1];

ddlj[p]=new double [pnode[p+1]];

pnodey[p][0]=1;// 每组每层的首值为1

}

} /**********************/

// 每个节点输出函数double fas(double s)

{ double t; t=1.0/(exp(-s)+1);

return t;

}

/************************************************/

// 该函数用来记录样本值和理想输出值void INPUT(int yangbenzushu1 ) { pY=new double*[yangbenzushu1]; pX=new double*[yangbenzushu1];

for(int yu=0;yu

{ pX[yu]=new double[Inputnodenum+1];

pY[yu]=new double[outputnodenum+1];

}

// 每组样本的首值赋为1

for(int yu1=0;yu1

{ pX[yu1][0]=1;

pY[yu1][0]=1;

}

cout<<" 请输出样本输入值"<

for(int yuy=0;yuy

cout<<"X["<>pX[yuy][yy];

}

cout<<" 请输出样本理想输出值"<

for(int yuy1=0;yuy1

for(int yy1=1;yy1<=outputnodenum;yy1++)

{ //if(yy==Inputnodenum) cout<

cout<<"Y["<

cin>>pY[yuy1][yy1];

}

}

******/

// 计算每个节点的输出值函数

double computeYl(int KK)//KK 代表第几组组号

{ double sum1=0;

// 把所有的层的每一个节点的输出值算出来并记录在 pnodey 里 ,不包含输入 点值

for(int y=0;y

{

for(int r=1;r

{ double sum=0;

for(int z=0;z

else

sum+=pnodey[y-1][z]*p[y][r-1][z];

}

pnodey[y][r]=fas(sum);

}

}

for(int j=1;j<=outputnodenum;j++)

sum1+=pow(pY[KK][j]-pnodey[Sidenum-1][j],2); return sum1;

}

/**********************************************************/ //Compute Back-Propagation-Errors void ComputeBackPropagationErrors(int gf)//gf 代表组号 {// 计算所有的 节点数 前一层的节点数

ddlj[][]

//for(int gf=0;gf

for(int q=Sidenum-1;q>=0;q--)// 从最后一层开始

{

if (q==Sidenum-1)// 如果是最外一层的话

{ for(int rt=0;rt

}

else

{

for(int ry=0;ry

{ double sumtemp=0;

for(int fg=0;fg

sumtemp+=ddlj[q+1][fg]*p[q+1][fg][ry+1];

ddlj[q][ry] = pnodey[q][ry+1]*(1-pnodey[q][ry+1])*

sumtemp;

}

}

}

// 计算所有的ddp[][]

//for(int gf1=0;gf1

for(int l=0;l

for(int JJ=0;JJ

ddp[l][JJ][i]=ddlj[l][JJ]*pX[gf][i];

else

ddp[l][JJ][i]=ddlj[l][JJ]*pnodey[l-1][i];

}

}

***/ void UpdatetheWeightsusingBPAlgorithm()

{ for(int cent=0;cent

for(int J=0;J

i=0;i

}

/********************************************************************** *****/ double xunlianErrors()//

定义训练误差函数

{ double error=0;

double sum=0;

double temp=0;

double temp1=0;

for(int gf1=0;gf1

{temp= computeYl(gf1);

//temp1=zhengquelv(gf1);

//sum+=temp1;

for(int jj=1;jj<=outputnodenum;jj++)

cout<

error+=temp;

} // sum=sum/yangbenzushu;

cout<<" 用训练集所得到的正确率: "<

return error/yangbenzushu;

每一层的节点数

前一层的节点数

}

******/ double jiaoyanErrors(int yangbenzushu1 )// {double

error=0;

定义校验误差函数double sum=0;

double temp=0;

double temp1=0;

for(int gf1=0;gf1

{temp= computeYl(gf1);

for(int jj=1;jj<=outputnodenum;jj++)

cout<

//temp1=zhengquelv(gf1);

//sum+=temp1;

error+=temp;

}

//sum=sum/yangbenzushu1;

// cout<<" 用校验集所得到的正确率:"<

return error/yangbenzushu1;

/********************************************************************/

double zhengquelv(int KK)

{int count=0;

double av=0;

//for(int gf1=0;gf1

for(int jj=1;jj<=outputnodenum;jj++)

{if (pnodey[Sidenum-1][jj]>0) pnodey[Sidenum-1][jj]=1;

else pnodey[Sidenum-1][jj]=0;

if(pY[KK][jj]==pnodey[Sidenum-1][jj])count++;

}

av=(double)count/outputnodenum;

return av;

}

/********************************************************************** */

void freeINput()

{

if(pX!=NULL)

{for(int u=0;u

delete []pX[u];

delete []pX;

pX=NULL;

}

if(pY!=NULL)

{for(int u1=0;u1

delete []pY[u1];

delete []pY;

pY=NULL;

}

}

/************************************************************** // 输出所有的权值

void wputout()

{ for (int j=0;j

{ cout<<" 第["<

for (int k=0;k

{ //if(k==pnode[j+1]-1) cout<

for (int t=0;t

cout<

if(t==pnode[j]) cout<

}

}

}

}

/**********************************************************/ };

void main()

{

BP bp;

int count=0;// 用来统计所用的迭代次数

//FILE *fp;

int inputnodenum,outnodenum,sidenum,yangbenzunum; double error;

cout<<" 请输入输入点数,输出点数,隐层数"<

cin>>inputnodenum>>outnodenum>>sidenum;

cout<<" 请输入样本组数"<

cin>>yangbenzunum;

// 第一步初始化所有的权值

bp.getW(sidenum,inputnodenum,outnodenum,yangbenzunum); // 第二步输入样本组

bp.INPUT(yangbenzunum);

for(;;count++)

{

double sum=0;

double temp=0;

for(int fuzu=0;fuzu

{

// 第三步计算所有y 值

temp=https://www.wendangku.net/doc/e516156796.html,puteYl(fuzu);

// 第四步Compute Back-Propagation-Errors

https://www.wendangku.net/doc/e516156796.html,puteBackPropagationErrors(fuzu);

// 第五步Update the Weights using BP Algorithm bp.UpdatetheWeightsusingBPAlgorithm();

sum+=temp;

}

// 第六步判断是否收敛

error=sum/2*yangbenzunum;

//freopen("debug\\out.txt","w",stdout);

//fp=freopen( "out.txt", "w", stdout) ;

// cout<

// fclose(stdout);// 关闭文件

/*if(count==1000)cout<

if(count==1500)cout<

if(error<1.02)

{

cout<<" 循环收敛"<<" 迭代次数为:"<

//bp.freeINput();// 释放X Y 空间

break;

}

}

cout<<" 权值为:"<

bp.wputout();

double XUNLIANER=bp.xunlianErrors();

//cout<<" 训练误差为:"<

bp.freeINput();// 释放X Y 空间

/*

cout<<" 请输入校验样本: "<

bp神经网络及matlab实现讲解学习

b p神经网络及m a t l a b实现

图1. 人工神经元模型 图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值 ( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为: 图中 yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数 ( Transfer Function ) ,net称为净激活(net activation)。若将阈值看成是神经元i的一个输入x0的权重wi0,则上面的式子可以简化为: 若用X表示输入向量,用W表示权重向量,即: X = [ x0 , x1 , x2 , ....... , xn ]

则神经元的输出可以表示为向量相乘的形式: 若神经元的净激活net为正,称该神经元处于激活状态或兴奋状态(fire),若净激活net为负,则称神经元处于抑制状态。 图1中的这种“阈值加权和”的神经元模型称为M-P模型 ( McCulloch-Pitts Model ),也称为神经网络的一个处理单元( PE, Processing Element )。 2. 常用激活函数 激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。 (1) 线性函数 ( Liner Function ) (2) 斜面函数 ( Ramp Function ) (3) 阈值函数 ( Threshold Function ) 以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数。 (4) S形函数 ( Sigmoid Function ) 该函数的导函数:

神经网络算法详解

神经网络算法详解 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在https://www.wendangku.net/doc/e516156796.html,/wiki/Iris_flower_data_set 找到。这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类。不同品种的Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度会有差异。我们现有一批已知品种的Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度的数据。 一种解决方法是用已有的数据训练一个神经网络用作分类器。 如果你只想用C#或Matlab快速实现神经网络来解决你手头上的问题,或者已经了解神经网络基本原理,请直接跳到第二节——神经网络实现。 第一节、神经网络基本原理 1. 人工神经元( Artificial Neuron )模型 人工神经元是神经网络的基本元素,其原理可以用下图表示: 图1. 人工神经元模型 图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为:

图中yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数( Transfer Function ) ,net称为净激活(net activation)。若将阈值看成是神经元i的一个输入x0的权重wi0,则上面的式子可以简化为: 若用X表示输入向量,用W表示权重向量,即: X = [ x0 , x1 , x2 , ....... , xn ] 则神经元的输出可以表示为向量相乘的形式: 若神经元的净激活net为正,称该神经元处于激活状态或兴奋状态(fire),若净激活net 为负,则称神经元处于抑制状态。 图1中的这种“阈值加权和”的神经元模型称为M-P模型 ( McCulloch-Pitts Model ),也称为神经网络的一个处理单元( PE, Processing Element )。 2. 常用激活函数 激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。 (1) 线性函数 ( Liner Function ) (2) 斜面函数 ( Ramp Function ) (3) 阈值函数 ( Threshold Function )

数学建模bp神经网络讲解学习

数学建模B P神经网 络论文

BP 神经网络 算法原理: 输入信号i x 通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号k y ,网络训练的每个样本包括输入向量x 和期望输出量d ,网络输出值y 与期望输出值d 之间的偏差,通过调整输入节点与隐层节点的联接强度取值ij w 和隐层节点与输出节点之间的联接强度jk T 以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。 变量定义: 设输入层有n 个神经元,隐含层有p 个神经元,输出层有q 个神经元 输入向量:()12,, ,n x x x x = 隐含层输入向量:()12,,,p hi hi hi hi = 隐含层输出向量:()12,,,p ho ho ho ho = 输出层输入向量:()12,,,q yi yi yi yi = 输出层输出向量:()12,,,q yo yo yo yo = 期望输出向量: ()12,, ,q do d d d = 输入层与中间层的连接权值: ih w 隐含层与输出层的连接权值: ho w 隐含层各神经元的阈值:h b 输出层各神经元的阈值: o b 样本数据个数: 1,2, k m =

激活函数: ()f ? 误差函数:21 1(()())2q o o o e d k yo k ==-∑ 算法步骤: Step1.网络初始化 。给各连接权值分别赋一个区间(-1,1)内的随机数,设定误差函数e ,给定计算精度值ε和最大学习次数M 。 Step2.随机选取第k 个输入样本()12()(),(), ,()n x k x k x k x k =及对应期望输出 ()12()(),(),,()q d k d k d k d k =o Step3.计算隐含层各神经元的输入()1 ()()1,2, ,n h ih i h i hi k w x k b h p ==-=∑和输出 ()()(())1,2, ,h h ho k f hi k h p ==及输出层各神经元的输入 ()1 ()()1,2, p o ho h o h yi k w ho k b o q ==-=∑和输出()()(())1,2, ,o o yo k f yi k o p == Step4.利用网络期望输出和实际输出,计算误差函数对输出层的各神经元的偏导数()o k δ。 o ho o ho yi e e w yi w ???=??? (()) () ()p ho h o o h h ho ho w ho k b yi k ho k w w ?-?==??∑ 2 1 1((()()))2(()())()(()())f (()) () q o o o o o o o o o o o o d k yo k e d k yo k yo k yi yi d k yo k yi k k δ=?-?'==--??'=---∑ Step5.利用隐含层到输出层的连接权值、输出层的()o k δ和隐含层的输出计算误差函数对隐含层各神经元的偏导数()h k δ。

BP神经网络详细讲解

PS:这篇介绍神经网络是很详细的,有一步一步的推导公式!神经网络是DL(深度学习)的基础。 如果对神经网络已经有所了解,可以直接跳到“三、BP算法的执行步骤“ 部分,算法框架清晰明了。 另外,如果对NN 很感兴趣,也可以参阅最后两篇参考博文,也很不错! 学习是神经网络一种最重要也最令人注目的特点。在神经网络的发展进程中,学习算法的研究有着十分重要的地位。目前,人们所提出的神经网络模型都是和学习算法相应的。所以,有时人们并不去祈求对模型和算法进行严格的定义或区分。有的模型可以有多种算法.而有的算法可能可用于多种模型。不过,有时人们也称算法为模型。 自从40年代Hebb提出的学习规则以来,人们相继提出了各种各样的学习算法。其中以在1986年Rumelhart等提出的误差反向传播法,即BP(error BackPropagation)法影响最为广泛。直到今天,BP算法仍然是自动控制上最重要、应用最多的有效算法。 1.2.1 神经网络的学习机理和机构 在神经网络中,对外部环境提供的模式样本进行学习训练,并能存储这种模式,则称为感知器;对外部环境有适应能力,能自动提取外部环境变化特征,则称为认知器。 神经网络在学习中,一般分为有教师和无教师学习两种。感知器采用有教师信号进行学习,而认知器则采用无教师信号学习的。在主要神经网络如BP网络,Hopfield网络,ART网络和Kohonen 网络中;BP网络和Hopfield网络是需要教师信号才能进行学习的;而ART网络和Kohonen网络则无需教师信号就可以学习。所谓教师信号,就是在神经网络学习中由外部提供的模式样本信号。 一、感知器的学习结构 感知器的学习是神经网络最典型的学习。 目前,在控制上应用的是多层前馈网络,这是一种感知器模型,学习算法是BP法,故是有教师学习算法。 一个有教师的学习系统可以用图1—7表示。这种学习系统分成三个部分:输入部,训练部和输出部。

BP神经网络详细讲解

PS:这篇介绍神经网络就是很详细得,有一步一步得推导公式!神经网络就是DL(深度学习)得基础。 如果对神经网络已经有所了解,可以直接跳到“三、BP算法得执行步骤“ 部分,算法框架清晰明了。 另外,如果对NN 很感兴趣,也可以参阅最后两篇参考博文,也很不错! 学习就是神经网络一种最重要也最令人注目得特点。在神经网络得发展进程中,学习算法得研究有着十分重要得地位。目前,人们所提出得神经网络模型都就是与学习算法相应得。所以,有时人们并不去祈求对模型与算法进行严格得定义或区分。有得模型可以有多种算法.而有得算法可能可用于多种模型。不过,有时人们也称算法为模型。 自从40年代Hebb提出得学习规则以来,人们相继提出了各种各样得学习算法。其中以在1986年Rumelhart等提出得误差反向传播法,即BP(error BackPropagation)法影响最为广泛。直到今天,BP算法仍然就是自动控制上最重要、应用最多得有效算法。 1.2.1 神经网络得学习机理与机构 在神经网络中,对外部环境提供得模式样本进行学习训练,并能存储这种模式,则称为感知器;对外部环境有适应能力,能自动提取外部环境变化特征,则称为认知器。 神经网络在学习中,一般分为有教师与无教师学习两种。感知器采用有教师信号进行学习,而认知器则采用无教师信号学习得。在主要神经网络如BP网络,Hopfield网络,ART网络与Kohonen 网络中;BP网络与Hopfield网络就是需要教师信号才能进行学习得;而ART网络与Kohonen网络则无需教师信号就可以学习。所谓教师信号,就就是在神经网络学习中由外部提供得模式样本信号。 一、感知器得学习结构 感知器得学习就是神经网络最典型得学习。 目前,在控制上应用得就是多层前馈网络,这就是一种感知器模型,学习算法就是BP法,故就是有教师学习算法。 一个有教师得学习系统可以用图1—7表示。这种学习系统分成三个部分:输入部,训练部与输出部。

BP神经网络的优缺点资料讲解

精品文档 BP神经网络的优缺点介绍 人工神经网络(Artificial Neural Network)又称连接机模型,是在现代神经学、生物学、心理学等学科研究的基础上产生的,它反映了生物神经系统处理外界事物的基本过程,是在模拟人脑神经组织的基础上发展起来的计算系统,是由大量处理单元通过广泛互联而构成的网络体系,它具有生物神经系统的基本特征,在一定程度上反映了人脑功能的若干反映,是对生物系统的某种模拟,具有大规模并行、分布式处理、自组织、自学习等优点,被广泛应用于语音分析、图像识别、数字水印、计算机视觉等很多领域,取得了许多突出的成果。最近由于人工神经网络的快速发展,它已经成为模式识别的强有力的工具。神经网络的运用展开了新的领域,解决其它模式识别不能解决的问题,其分类功能特别适合于模式识别与分类的应用。多层前向BP网络是目前应用最多的一种神经网络形式, 它具备神经网络的普遍优点,但它也不是非常完美的, 为了更好的理解应用神经网络进行问题求解, 这里对它的优缺点展开一些讨论。 首先BP神经网络具有以下优点: 1) 非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数。这使得其特别适合于求解内部机制复杂的问题,即BP神经网络具有较强的非线性映射能力。 2) 自学习和自适应能力:BP神经网络在训练时,能够通过学习自动提取输出、输出数据间的“合理规则”,并自适应的将学习内容记忆于网络的权值中。即BP神经网络具有高度自学习和自适应的能力。 3) 泛化能力:所谓泛化能力是指在设计模式分类器时,即要考虑网络在保证对所需分类对象进行正确分类,还要关心网络在经过训练后,能否对未见过的模式或有噪声污染的模式,进行正确的分类。也即BP神经网络具有将学习成果应用于新知识的能力。 4) 容错能力:BP神经网络在其局部的或者部分的神经元受到破坏后对全局的训练结果不会造成很大的影响,也就是说即使系统在受到局部损伤时还是可以正常工作的。即BP神经网络具有一定的容错能力。 鉴于BP神经网络的这些优点,国内外不少研究学者都对其进行了研究,并运用网络解决了不少应用问题。但是随着应用范围的逐步扩大,BP神经网络也暴露出了越来越多的缺点和不足,比如: 精品文档

相关文档