1 / 15
文档名称:

bp神经网络算法原理.doc

格式:doc   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

bp神经网络算法原理.doc

上传人:sanshengyuanting 2016/7/27 文件大小:0 KB

下载得到文件列表

bp神经网络算法原理.doc

相关文档

文档介绍

文档介绍:BP 网络模型处理信息的基本原理是:输入信号 X i通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号 Y k,网络训练的每个样本包括输入向量 X和期望输出量 t,网络输出值 Y与期望输出值 t之间的偏差,通过调整输入节点与隐层节点的联接强度取值 W ij和隐层节点与输出节点之间的联接强度 T jk以及阈值,使误差沿梯度方向下降,经过反复学****训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。一BP神经网络模型 BP 网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学****模型。( 1)节点输出模型隐节点输出模型: O j =f( ∑W ij×X i-q j) (1) 输出节点输出模型: Y k =f( ∑T jk×O j-q k) (2) f- 非线形作用函数; q-神经单元阈值。(2)作用函数模型作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1) 内连续取值 Sigmoid 函数:f(x)=1/(1+e -x) (3) (3)误差计算模型误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数: E p=1/2 ×∑(t pi-O pi) 2 (4) t pi-i节点的期望输出值; O pi-i节点计算输出值。(4)自学****模型神经网络的学****过程,即连接下层节点和上层节点之间的权重拒阵 W ij的设定和误差修正过程。 BP网络有师学****方式-需要设定期望值和无师学****方式-只需输入模式之分。自学****模型为△W ij(n+1)= h ×Ф i×O j+a×△ W ij(n) (5) h-学****因子; Ф i-输出节点 i的计算误差; O j-输出节点 j的计算输出; a-动量因子。二BP网络模型的缺陷分析及优化策略(1)学****因子 h的优化采用变步长法根据输出误差大小自动调整学****因子,来减少迭代次数和加快收敛速度。 h=h+a ×(E p (n)-E p (n-1) )/E p (n)a为调整步长, 0~1 之间取值(6) (2)隐层节点数的优化隐节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学****时间过长,甚至不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析法并进行参数的显著性检验来动态删除一些线形相关的隐节点,节点删除标准:当由该节点出发指向下一层节点的所有权值和阈值均落于死区(通常取± 、± 等区间)之中,则该节点可删除。最佳隐节点数 L可参考下面公式计算: L=(m+n) 1/2+c(7) m-输入节点数; n-输出节点数; c-介于 1~10的常数。(3)输入和输出神经元的确定利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。(4)算法优化由于 BP算法采用的是剃度下降法,因而易陷于局部最小并且训练时间较长。用基于生物免疫机制地既能全局搜索又能避免未成熟收敛的免疫遗传算法 IGA 取代传统 BP算法来克服此缺点。该程序实现神经网络的 BP算法, 输入节点数, 输出节点数, 隐层数, 隐层节点数任意,由用户决定。其中隐层数指的是总共曾数包含输出层,比如说异或算法为 2 层,第一层节点数为 2 ,第二层也即输出层节点数为 1 ,输入点数为 2。但是该程序对异或算法实现并不理想, 对多层多节点的神经网络有较好的结果。#include "" #include <> #include <> #include<fstream> #include <> #include " " #define MAXCOUNT 1e5 // 迭代训练次数上限//精度 的随机浮点数, 范围在- —— float randf() { return (float)((rand() % 1001) * -); } // 高斯随机数产生函数 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* sq