BP神经网络算法原理

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)隐层节点数的优化

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

区(通常取±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[] ddp[m][n];}

delete[] p[m];

delete[] ddp[m];

}

delete[] p;

delete[] ddp;

p=NULL;

ddp=NULL;

相关文档
最新文档