You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

413 lines
15 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# BPnetwork11
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define INNODE 2 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
#define HIDENODE 12// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
#define OUTNODE 1 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
/**
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧϰ<D1A7>ʣ<EFBFBD>
*/
double StudyRate = 1.2;
/**
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
double threshold = 1e-4;
/**
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int mostTimes = 1e6;
/**
* ѵ<><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
*/
int trainSize = 0;
/**
* <20><><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>С
*/
int testSize = 0;
/**
* <20><><EFBFBD><EFBFBD>
*/
typedef struct Sample{
double out[30][OUTNODE]; // <20><><EFBFBD>
double in[30][INNODE]; // <20><><EFBFBD><EFBFBD>
}Sample;
/**
* <20><>Ԫ<EFBFBD><D4AA><EFBFBD>
*/
typedef struct Node{
double value; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
double bias; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD>ƫƫ<C6AB><C6AB>ֵ
double bias_delta; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD>ƫ<EFBFBD><C6AB>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
double *weight; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E3B4AB><EFBFBD><EFBFBD>Ȩֵ
double *weight_delta; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E3B4AB><EFBFBD><EFBFBD>Ȩֵ<C8A8><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}Node;
/**
* <20><><EFBFBD><EFBFBD><EFBFBD>
*/
Node inputLayer[INNODE];
/**
* <20><><EFBFBD>ز<EFBFBD>
*/
Node hideLayer[HIDENODE];
/**
* <20><><EFBFBD><EFBFBD><EFBFBD>
*/
Node outLayer[OUTNODE];
double Max(double a, double b){
return a > b ? a : b;
}
//<2F><><EFBFBD>
double sigmoid(double x){
double y,z;
y=exp(x);
z=y/(1+y);
return z;
}
/**
* <20><>ȡѵ<C8A1><D1B5><EFBFBD><EFBFBD>
* @param filename <20>ļ<EFBFBD><C4BC><EFBFBD>
* @return ѵ<><D1B5><EFBFBD><EFBFBD>
*/
Sample * getTrainData(const char * filename){
Sample * result = (Sample*)malloc(sizeof (Sample));
FILE * file = fopen(filename, "r");
if(file != NULL){
int count = 0;
while (fscanf(file, "%lf %lf %lf", &result->in[count][0], &result->in[count][1], &result->out[count][0]) != EOF){
++count;
}
trainSize = count;
printf("%s The file has been successfully read!\n", filename);
fclose(file);
return result;
} else{
fclose(file);
printf("%s Encountered an error while opening the file!\n\a", filename);
return NULL;
}
}
/**
* <20><>ȡ<EFBFBD><C8A1><EFBFBD>Լ<EFBFBD>
* @param filename <20>ļ<EFBFBD><C4BC><EFBFBD>
* @return <20><><EFBFBD>Լ<EFBFBD>
*/
Sample * getTestData(const char * filename){
/*<2A><><EFBFBD>ڴ<EFBFBD><DAB4>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF><D5BC><EFBFBD><EFBFBD>һ<E6B4A2><D2BB>Sample<6C><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><E6B4A2>result<6C><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
Sample * result=(Sample*)malloc(sizeof(Sample));
FILE * file = fopen(filename, "r");//<2F><><EFBFBD>ļ<EFBFBD>
if(file!= NULL){
// <20><>ʼ<EFBFBD><CABC>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>count<6E><74><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>ٶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int count=0;
/*<2A><><EFBFBD><EFBFBD>whileѭ<65><D1AD><EFBFBD>Ӳ<EFBFBD><D3B2>Լ<EFBFBD><D4BC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ļ<EFBFBD>ĩβ<C4A9><CEB2>
ÿ<>γɹ<CEB3><C9B9><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ݺ󣬵<DDBA><F3A3ACB5><EFBFBD>count<6E><74>*/
while (fscanf(file, "%lf %lf", &result->in[count][0], &result->in[count][1])!=EOF){
++count;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>count<6E><74>ֵ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>ΪtestSize<7A><65>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>У<EFBFBD><D0A3>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
testSize=count;
printf("%s The file has been successfully read!\n", filename);
fclose(file);
//<2F><><EFBFBD><EFBFBD>result
return result;
}else{
fclose(file);
printf("%s Encountered an error while opening the file!\n\a", filename);
return NULL;
}
}
/**
* <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
* @param data Ҫ<><D2AA>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
*/
void printData(Sample * data, int size){
int i;
if(data==NULL){
printf("Sample is empty!");
return;
}
else{
for(i=0;i<testSize;i++)
{
printf("%f %f ",data->in[i][0],data->in[i][1]);
printf("%f",data->out[i][0]);
printf("\n");
}
}
}
/**
* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void init(){
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
srand(time(NULL));
// <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>
for (int i = 0; i < INNODE; ++i) {
inputLayer[i].weight = (double *)malloc(sizeof (double ) * HIDENODE);
inputLayer[i].weight_delta = (double *) malloc(sizeof (double ) * HIDENODE);
inputLayer[i].bias = 0.0;
inputLayer[i].bias_delta = 0.0;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩֵ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
for (int i = 0; i < INNODE; ++i) {
for (int j = 0; j < HIDENODE; ++j) {
inputLayer[i].weight[j] = rand() % 10000 / (double )10000 * 2 - 1.0;
inputLayer[i].weight_delta[j] = 0.0;
}
}
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < HIDENODE; ++i) {
/*Ϊ<><CEAA><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> double <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<EFBFBD>ýڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ڵ㴫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>ء<EFBFBD>
ʹ<EFBFBD><EFBFBD>malloc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<EFBFBD>Դ洢 OUTNODE <EFBFBD><EFBFBD> double <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>Ȩ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
*/
hideLayer[i].weight = (double *)malloc(sizeof(double)*OUTNODE);
/*Ϊ<><CEAA><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢Ȩ<EFBFBD>صĸ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
ʹ<EFBFBD><EFBFBD>malloc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<EFBFBD>Դ洢 OUTNODE <EFBFBD><EFBFBD> double <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>Ȩ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
*/
hideLayer[i].weight_delta =(double*)malloc(sizeof(double)*OUTNODE);
/*Ϊ<><CEAA><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ֵͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1.0 <EFBFBD><EFBFBD> 1.0 ֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýڵ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
*/
hideLayer[i].bias = rand() % 10000 / (double )10000 * 2 - 1.0;
/*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵΪ0.0<EFBFBD><EFBFBD>*/
hideLayer[i].bias_delta = 0.0;
}
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD>Ȩֵ
for (int i = 0; i < HIDENODE; ++i) {
for (int j = 0; j < OUTNODE; ++j) {
hideLayer[i].weight[j] = rand() % 10000 / (double )10000 * 2 - 1.0;
hideLayer[i].weight_delta[j] = 0.0;
}
}
for (int i = 0; i < OUTNODE; ++i) {
outLayer[i].bias = rand() % 10000 / (double )10000 * 2 - 1.0;
outLayer[i].bias_delta = 0.0;
}
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
void resetDelta(){
for (int i = 0; i < INNODE; ++i) {
for (int j = 0; j < HIDENODE; ++j) {
inputLayer[i].weight_delta[j] = 0.0;
}
}
for (int i = 0; i < HIDENODE; ++i) {
hideLayer[i].bias_delta = 0.0;
for (int j = 0; j < OUTNODE; ++j) {
hideLayer[i].weight_delta[j] = 0.0;
}
}
for (int i = 0; i < OUTNODE; ++i) {
outLayer[i].bias_delta = 0.0;
}
}
int main() {
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
init();
// <EFBFBD><EFBFBD>ȡѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Sample * trainSample = getTrainData("TrainData.txt");
// printData(trainSample, trainSize);
for (int trainTime = 0; trainTime < mostTimes; ++trainTime) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><EFBFBD><EFBFBD>Ϣ
resetDelta();
// <EFBFBD><EFBFBD>ǰѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double error_max = 0.0;
// <EFBFBD><EFBFBD>ʼѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>bp<EFBFBD><EFBFBD>
for (int currentTrainSample_Pos = 0; currentTrainSample_Pos < trainSize; ++currentTrainSample_Pos) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>
for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
inputLayer[inputLayer_Pos].value = trainSample->in[currentTrainSample_Pos][inputLayer_Pos];
}
/** ----- <20><>ʼ<EFBFBD><CABC><EFBFBD>򴫲<EFBFBD> ----- */
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
double sum = 0.0;
for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
sum += inputLayer[inputLayer_Pos].value * inputLayer[inputLayer_Pos].weight[hideLayer_Pos];
}
sum -= hideLayer[hideLayer_Pos].bias;
hideLayer[hideLayer_Pos].value = sigmoid(sum);
}
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE ; ++outLayer_Pos) {
double sum = 0.0;
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
/*<2A><><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD>ڵ<EFBFBD><DAB5>value<EFBFBD><EFBFBD>Ȩֵ<EFBFBD>ij˻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵõ<EFBFBD>sum*/
sum+=hideLayer[hideLayer_Pos].value * hideLayer[hideLayer_Pos].weight[outLayer_Pos];
}
/*<2A><><EFBFBD><EFBFBD>sum<EFBFBD><EFBFBD>ʹsum<EFBFBD><EFBFBD>ȥƫ<EFBFBD><EFBFBD>ֵ;
*/sum-=outLayer[outLayer_Pos].bias;
outLayer[outLayer_Pos].value=sigmoid(sum);
/*<2A><><EFBFBD><EFBFBD>sigmod<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եõ<EFBFBD><EFBFBD><EFBFBD>sum<EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>Ѽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>value(outLayer[outLayer_Pos].value)<29><>
*/
}
/** ----- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----- */
double error = 0.0;
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
double temp = fabs(outLayer[outLayer_Pos].value - trainSample->out[currentTrainSample_Pos][outLayer_Pos]);
// <20><>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD>
error += temp * temp / 2.0;
}
error_max = Max(error_max, error);
/** ----- <20><><EFBFBD>򴫲<EFBFBD> ----- */
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
double bias_delta = -(trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
* outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value);
outLayer[outLayer_Pos].bias_delta += bias_delta;
}
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
double weight_delta = (trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
* outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value)
* hideLayer[hideLayer_Pos].value;
hideLayer[hideLayer_Pos].weight_delta[outLayer_Pos] += weight_delta;
}
}
//
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
double sum = 0.0;
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
sum += -(trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
* outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value)
* hideLayer[hideLayer_Pos].weight[outLayer_Pos];
}
hideLayer[hideLayer_Pos].bias_delta += sum * hideLayer[hideLayer_Pos].value * (1.0 - hideLayer[hideLayer_Pos].value);
}
for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
double sum = 0.0;
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
sum += (trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
* outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value)
* hideLayer[hideLayer_Pos].weight[outLayer_Pos];
}
inputLayer[inputLayer_Pos].weight_delta[hideLayer_Pos] += sum * hideLayer[hideLayer_Pos].value * (1.0 - hideLayer[hideLayer_Pos].value)
* inputLayer[inputLayer_Pos].value;
}
}
}
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
if(error_max < threshold){
printf("\a Training completed!Total training count:%d, maximum error is:%f\n", trainTime + 1, error_max);
break;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
inputLayer[inputLayer_Pos].weight[hideLayer_Pos] += StudyRate
* inputLayer[inputLayer_Pos].weight_delta[hideLayer_Pos] /
(double) trainSize;
}
}
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
hideLayer[hideLayer_Pos].bias += StudyRate
* hideLayer[hideLayer_Pos].bias_delta / (double )trainSize;
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
hideLayer[hideLayer_Pos].weight[outLayer_Pos] += StudyRate
* hideLayer[hideLayer_Pos].weight_delta[outLayer_Pos] / (double )trainSize;
}
}
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
outLayer[outLayer_Pos].bias += StudyRate
* outLayer[outLayer_Pos].bias_delta / (double )trainSize;
}
}
// ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>
Sample * testSample = getTestData("TestData.txt");
printf("The predicted results are as follows:\n");
for (int currentTestSample_Pos = 0; currentTestSample_Pos < testSize; ++currentTestSample_Pos) {
for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
inputLayer[inputLayer_Pos].value = testSample->in[currentTestSample_Pos][inputLayer_Pos];
}
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
double sum = 0.0;
for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
sum += inputLayer[inputLayer_Pos].value * inputLayer[inputLayer_Pos].weight[hideLayer_Pos];
}
sum -= hideLayer[hideLayer_Pos].bias;
hideLayer[hideLayer_Pos].value = sigmoid(sum);
}
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
double sum = 0.0;
for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
sum += hideLayer[hideLayer_Pos].value * hideLayer[hideLayer_Pos].weight[outLayer_Pos];
}
sum -= outLayer[outLayer_Pos].bias;
outLayer[outLayer_Pos].value = sigmoid(sum);
}
for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
testSample->out[currentTestSample_Pos][outLayer_Pos] = outLayer[outLayer_Pos].value;
}
}
printData(testSample, testSize);
return 0;
}