C语言实现BP神经网络模型
时间: 2024-04-14 12:09:07 浏览: 122
bp神经网络 C语言实现
BP(Back Propagation)神经网络是一种常见的人工神经网络模型,用于解决分类、回归、时间序列预测等问题。下面是一个简单的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 MAX_ITERATION 10000 // 最大迭代次数
// sigmoid函数
double sigmoid(double x)
{
return 1.0 / (1.0 + exp(-x));
}
// sigmoid函数的导数
double dsigmoid(double x)
{
return x * (1.0 - x);
}
int main()
{
double input[INPUT_NUM] = {0.05, 0.10}; // 输入向量
double target[OUTPUT_NUM] = {0.01}; // 目标输出向量
double hidden[HIDDEN_NUM] = {0.0}; // 隐层节点输出向量
double output[OUTPUT_NUM] = {0.0}; // 输出层节点输出向量
// 初始化权值和阈值
double w1[INPUT_NUM][HIDDEN_NUM] = {{0.15, 0.25, 0.35}, {0.20, 0.30, 0.40}};
double w2[HIDDEN_NUM][OUTPUT_NUM] = {{0.45}, {0.50}, {0.55}};
double b1[HIDDEN_NUM] = {0.35, 0.35, 0.35};
double b2[OUTPUT_NUM] = {0.60};
int iteration = 0;
while(iteration < MAX_ITERATION)
{
// 前向传播
for(int i = 0; i < HIDDEN_NUM; i++)
{
double net = 0.0;
for(int j = 0; j < INPUT_NUM; j++)
{
net += input[j] * w1[j][i];
}
net += b1[i];
hidden[i] = sigmoid(net);
}
for(int i = 0; i < OUTPUT_NUM; i++)
{
double net = 0.0;
for(int j = 0; j < HIDDEN_NUM; j++)
{
net += hidden[j] * w2[j][i];
}
net += b2[i];
output[i] = sigmoid(net);
}
// 反向传播
double error = 0.0;
double delta_output[OUTPUT_NUM] = {0.0};
double delta_hidden[HIDDEN_NUM] = {0.0};
for(int i = 0; i < OUTPUT_NUM; i++)
{
error += 0.5 * (target[i] - output[i]) * (target[i] - output[i]);
delta_output[i] = (target[i] - output[i]) * dsigmoid(output[i]);
}
for(int i = 0; i < HIDDEN_NUM; i++)
{
double sum = 0.0;
for(int j = 0; j < OUTPUT_NUM; j++)
{
sum += delta_output[j] * w2[i][j];
}
delta_hidden[i] = sum * dsigmoid(hidden[i]);
}
// 更新权值和阈值
for(int i = 0; i < HIDDEN_NUM; i++)
{
for(int j = 0; j < INPUT_NUM; j++)
{
w1[j][i] += LEARNING_RATE * delta_hidden[i] * input[j];
}
b1[i] += LEARNING_RATE * delta_hidden[i];
}
for(int i = 0; i < OUTPUT_NUM; i++)
{
for(int j = 0; j < HIDDEN_NUM; j++)
{
w2[j][i] += LEARNING_RATE * delta_output[i] * hidden[j];
}
b2[i] += LEARNING_RATE * delta_output[i];
}
printf("iteration: %d, error: %f\n", iteration, error);
iteration++;
}
// 输出结果
printf("input: %f, %f\n", input[0], input[1]);
printf("output: %f\n", output[0]);
return 0;
}
```
以上代码实现了一个简单的BP神经网络模型,包括输入层、隐层和输出层。代码中使用了sigmoid函数作为激活函数,采用均方误差作为损失函数,并使用反向传播算法进行权值和阈值的更新。在代码中,我们使用了一个较小的学习率(LEARNING_RATE),并设置了最大迭代次数(MAX_ITERATION),以保证模型能够较快收敛。最终输出结果为输入向量对应的输出值,即BP神经网络的预测结果。
阅读全文