📄 bp_learnfunction.cpp
字号:
#include <stdlib.h>
#include <math.h>
#include "bp.h"
#include "bp_learnfunction.h"
//调用rand函数来初始化权重系数
void Random( double referArray[][MAXDIMREFER][MAXDIMREFER] )
{
for( int i = 0; i < PRERANDOM; i++ )//改变PRERANDOM(bp.h中)的值来改变权重系数的初始值
rand();
for( int rank = 0; rank < RANK; rank++ )
for( int dim1 = 0; dim1 < MAXDIMREFER; dim1++ )
for( int dim2 = 0; dim2 < MAXDIMREFER; dim2++ )
referArray[rank][dim1][dim2] =( ( double )rand() - RAND_MAX/2 )/ RAND_MAX * 2 ;//系数值为-1到1之间
}
//初始化各权重系数增量为0
void Zero( double incReferArray[][MAXDIMREFER][MAXDIMREFER] )
{
for( int rank = 0; rank < RANK; rank++ )
for( int dim1 = 0; dim1 < MAXDIMREFER; dim1++ )
for( int dim2 = 0; dim2 < MAXDIMREFER; dim2++ )
incReferArray[rank][dim1][dim2] = 0;
}
//求BP网络各层输出
void GetTheOut( int rank, double referArray[][MAXDIMREFER][MAXDIMREFER], double out[][MAXDIMREFER] )
{
double u;
if( rank == 1 )
{
out[rank][0] = 1;
for( int dimRefer1A = 1; dimRefer1A <= DIMREFER1; dimRefer1A++ )
{
u = 0;
for( int dimXB = 0; dimXB <= DIMX; dimXB++ )
u += referArray[rank][dimRefer1A][dimXB] * out[rank-1][dimXB] ;
out[rank][dimRefer1A] = G(u);
}
}
if( rank == ( RANK - 1) )
{
for( int dimY = 0; dimY < DIMY ; dimY++ )
{
u = 0;
for( int dimRefer1B = 0; dimRefer1B <= DIMREFER1; dimRefer1B++ )
u += referArray[rank][dimY][dimRefer1B]*out[rank-1][dimRefer1B];//最后一层输出为y
out[rank][dimY] = G(u);
}
}
}
//反相计算各层梯度
void GetTheErr( int rank, double referArray[][MAXDIMREFER][MAXDIMREFER], double out[][MAXDIMREFER], double e[][MAXDIMREFER], double yArray[][DIMY], int learn )
{
if( rank == RANK - 1 )//输出层
{
for( int dimYA = 0; dimYA < DIMY; dimYA++ )
e[rank][dimYA] = (yArray[learn][dimYA] - out[rank][dimYA] ) * CONFACTOR * out[rank][dimYA]*( 1 - out[rank][dimYA] );
}
if( rank == RANK - 2 )
{
for( int dimRefer1 = 0; dimRefer1 <= DIMREFER1; dimRefer1++ )
{
e[rank][dimRefer1] = 0;
for( int dimYB = 0; dimYB < DIMY; dimYB++ )
e[rank][dimRefer1] += e[rank+1][dimYB] * referArray[rank+1][dimYB][dimRefer1];
e[rank][dimRefer1] *= CONFACTOR * out[rank][dimRefer1] * (1 - out[rank][dimRefer1] );
}
}
}
void ModifyRefer( int rank, double referArray[][MAXDIMREFER][MAXDIMREFER], double out[][MAXDIMREFER], double e[][MAXDIMREFER], double yArray[][DIMY], double incReferArray[][MAXDIMREFER][MAXDIMREFER] )
{
if( rank == 1 )//第1层 (隐层)
{
for( int dimRefer1A = 0; dimRefer1A <= DIMREFER1; dimRefer1A++ )
for( int dimX = 0; dimX <= DIMX; dimX++ )
{
incReferArray[rank][dimRefer1A][dimX] =
STEPLENGTH * e[rank][dimRefer1A] * out[rank-1][dimX] + INERTIA * incReferArray[rank][dimRefer1A][dimX];
referArray[rank][dimRefer1A][dimX] += incReferArray[rank][dimRefer1A][dimX];
}
}
if( rank == RANK-1 )//输出层
{
for( int dimY = 0; dimY < DIMY; dimY++ )
for( int dimRefer1B = 0; dimRefer1B <= DIMREFER1; dimRefer1B++ )
{
incReferArray[rank][dimY][dimRefer1B] =
STEPLENGTH * e[rank][dimY] * out[rank-1][dimRefer1B] + INERTIA * incReferArray[rank][dimY][dimRefer1B];
referArray[rank][dimY][dimRefer1B] += incReferArray[rank][dimY][dimRefer1B];
}
}
}
//计算指标函数值
double GetThePowE(double yArray[][DIMY], double out[][MAXDIMREFER], int learn )
{
double e;
e = 0;
for( int dimY = 0; dimY < DIMY; dimY++ )
{
e += ( yArray[learn][dimY] - out[RANK-1][dimY] ) * ( yArray[learn][dimY] - out[RANK-1][dimY] );
}
return 0.5 * e;
}
//对训练后的BP网络,由输入求解输出
void GetYValue( double xArray[DIMX], double yArray[DIMY], double referArray[][MAXDIMREFER][MAXDIMREFER] )
{
double out[RANK][MAXDIMREFER];
out[0][0] = 1;
for( int dimXA = 1; dimXA <= DIMX; dimXA++ )
out[0][dimXA] = xArray[dimXA - 1];
for( int rankA = 1; rankA < RANK; rankA++ )
GetTheOut( rankA, referArray, out );
for( int dimY = 0; dimY < DIMY; dimY++ )
yArray[dimY] = out[2][dimY];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -