#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#include "memory.h"
#define BP_H
class BpNet
{
private:
int _nInput; //输入层节点个数
int _nHide; //隐含层节点个数
int _nOutput; //输出层节点个数
double **_pplfWeight1; //输入层-隐含层权系数
double **_pplfWeight2; //隐含层-输出层权系数
double *_plfb1; //隐含层结点的阈值
double *_plfb2; //输出层结点的阈值
double *_plfHideIn, *_plfHideOut; //隐含层的网络输入和输出
double *_plfOutputIn, *_plfOutputOut; //输出层的网络输入和输出
double _a; //学习率
double _e; //目标误差
private:
static double sigmoid(double x);
double(*f)(double); //激活函数
void Init();
public:
BpNet(int nInput, int nHide, int nOutput);
virtual ~BpNet();
void Set(double a, double e);
void GetBasicInformation(int &nInput, int &nHide, int &nOutput, double &lfA, double &lfE);
bool Train(int n, double **pplfInput, double **pplfDesire);
void Classify(double plfInput[], double plfOutput[]);
};
void showInfo(int n, int nInput, int nHide, int nOutput, double lfA, double lfE, double **ppInput, double **ppOutput)
{
printf("输入层节点数:%d; 隐层节点数:%d; 输出层节点数:%d\n", nInput, nHide, nOutput);
printf("学习因子:%lf; 最大允许误差:%lf\n", lfA, lfE);
printf("学习样本为:\n");
printf("输入:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < nInput; j++) printf("%8.5lf", ppInput[i][j]);
printf("\n");
}
printf("期望输出:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < nOutput; j++) printf("%8.5lf", ppOutput[i][j]);
printf("\n");
}
}
BpNet::BpNet(int nInput, int nHide, int nOutput)
{
_a = 0.2;
_e = 0.01;
_nInput = nInput;
_nHide = nHide;
_nOutput = nOutput;
Init();
srand((unsigned)time(NULL));
rand();
//初始化输入层-隐含层权系数
for (int i = 0; i < _nInput; i++)
for (int j = 0; j < _nHide; j++)
_pplfWeight1[i][j] = (double)(rand() % 20000 - 10000) / 100000;// rand() / (double)(RAND_MAX);
//初始化隐含层-输出层权系数
for (int i = 0; i < _nHide; i++)
for (int j = 0; j < _nOutput; j++)
_pplfWeight2[i][j] = (double)(rand() % 20000 - 10000) / 100000;// rand() / (double)(RAND_MAX);
//初始化隐含层的阈值
for (int i = 0; i < _nHide; i++)
_plfb1[i] = (double)(rand() % 20000 - 10000) / 100000;
//初始化输出层的阈值
for (int i = 0; i < _nOutput; i++)
_plfb2[i] = (double)(rand() % 20000 - 10000) / 100000;
//使用sigmoid激活函数
f = sigmoid;
}
BpNet::~BpNet()
{
delete[]_plfHideIn;
delete[]_plfHideOut;
delete[]_plfOutputIn;
传统BP神经网络(三层)完整例子(电力负荷预测)
于 2015-12-24 16:14:07 首次发布