你能写一段C语言实现的BP神经网络算法吗
时间: 2023-05-11 12:04:33 浏览: 54
当然可以,以下是一段C语言实现的BP神经网络算法:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INPUT_NUM 2
#define HIDDEN_NUM 3
#define OUTPUT_NUM 1
#define LEARNING_RATE 0.5
#define EPOCH 10000
double sigmoid(double x) {
return 1.0 / (1.0 + exp(-x));
}
double sigmoid_derivative(double x) {
return x * (1.0 - x);
}
int main() {
double input[INPUT_NUM][4] = {{0, 0, 1, 1}, {0, 1, 0, 1}};
double output[OUTPUT_NUM][4] = {{0, 1, 1, 0}};
double hidden_weight[HIDDEN_NUM][INPUT_NUM + 1];
double output_weight[OUTPUT_NUM][HIDDEN_NUM + 1];
double hidden_output[HIDDEN_NUM];
double output_output[OUTPUT_NUM];
double hidden_delta[HIDDEN_NUM];
double output_delta[OUTPUT_NUM];
int i, j, k, epoch;
srand(1);
for (i = 0; i < HIDDEN_NUM; i++) {
for (j = 0; j < INPUT_NUM + 1; j++) {
hidden_weight[i][j] = (double)rand() / RAND_MAX;
}
}
for (i = 0; i < OUTPUT_NUM; i++) {
for (j = 0; j < HIDDEN_NUM + 1; j++) {
output_weight[i][j] = (double)rand() / RAND_MAX;
}
}
for (epoch = 0; epoch < EPOCH; epoch++) {
double error = 0.0;
for (k = 0; k < 4; k++) {
// forward
for (i = 0; i < HIDDEN_NUM; i++) {
double sum = hidden_weight[i][INPUT_NUM];
for (j = 0; j < INPUT_NUM; j++) {
sum += input[j][k] * hidden_weight[i][j];
}
hidden_output[i] = sigmoid(sum);
}
for (i = 0; i < OUTPUT_NUM; i++) {
double sum = output_weight[i][HIDDEN_NUM];
for (j = 0; j < HIDDEN_NUM; j++) {
sum += hidden_output[j] * output_weight[i][j];
}
output_output[i] = sigmoid(sum);
}
// backward
for (i = 0; i < OUTPUT_NUM; i++) {
output_delta[i] = (output_output[i] - output[i][k]) * sigmoid_derivative(output_output[i]);
for (j = 0; j < HIDDEN_NUM; j++) {
output_weight[i][j] -= LEARNING_RATE * output_delta[i] * hidden_output[j];
}
output_weight[i][HIDDEN_NUM] -= LEARNING_RATE * output_delta[i];
}
for (i = 0; i < HIDDEN_NUM; i++) {
double sum = 0.0;
for (j = 0; j < OUTPUT_NUM; j++) {
sum += output_delta[j] * output_weight[j][i];
}
hidden_delta[i] = sum * sigmoid_derivative(hidden_output[i]);
for (j = 0; j < INPUT_NUM; j++) {
hidden_weight[i][j] -= LEARNING_RATE * hidden_delta[i] * input[j][k];
}
hidden_weight[i][INPUT_NUM] -= LEARNING_RATE * hidden_delta[i];
}
error += 0.5 * (output_output[0] - output[0][k]) * (output_output[0] - output[0][k]);
}
printf("Epoch %d, error = %lf\n", epoch, error);
}
return 0;
}
```