Python + NumPy 从零实现的 BP 神经网络(反向传播)脚本模型,包含前向传播、反向传播、训练和预测,并用 XOR 数据做示例

下面是一个用 Python + NumPy 从零实现的 BP 神经网络(反向传播)脚本模型,包含前向传播、反向传播、训练和预测,并用 XOR 数据做示例。

```python

import numpy as np

class BPNeuralNetwork:

def init(self, input_size, hidden_size, output_size, lr=0.5):

"""

input_size: 输入维度

hidden_size: 隐藏层神经元数量

output_size: 输出维度

lr: 学习率

"""

np.random.seed(42)

初始化权重和偏置

self.W1 = np.random.randn(input_size, hidden_size) * np.sqrt(1 / input_size)

self.b1 = np.zeros((1, hidden_size))

self.W2 = np.random.randn(hidden_size, output_size) * np.sqrt(1 / hidden_size)

self.b2 = np.zeros((1, output_size))

self.lr = lr

def sigmoid(self, z):

return 1.0 / (1.0 + np.exp(-z))

def sigmoid_derivative(self, z):

s = self.sigmoid(z)

return s * (1 - s)

def forward(self, X):

"""前向传播"""

self.z1 = X @ self.W1 + self.b1

self.a1 = self.sigmoid(self.z1)

self.z2 = self.a1 @ self.W2 + self.b2

self.a2 = self.sigmoid(self.z2)

return self.a2

def backward(self, X, y):

"""反向传播 + 参数更新"""

m = X.shape0

输出层误差

delta2 = (self.a2 - y) * self.sigmoid_derivative(self.z2)

dW2 = self.a1.T @ delta2 / m

db2 = np.sum(delta2, axis=0, keepdims=True) / m

隐藏层误差

delta1 = (delta2 @ self.W2.T) * self.sigmoid_derivative(self.z1)

dW1 = X.T @ delta1 / m

db1 = np.sum(delta1, axis=0, keepdims=True) / m

梯度下降更新参数

self.W2 -= self.lr * dW2

self.b2 -= self.lr * db2

self.W1 -= self.lr * dW1

self.b1 -= self.lr * db1

def train(self, X, y, epochs=10000, verbose=True):

"""训练模型"""

for i in range(epochs):

self.forward(X)

self.backward(X, y)

if verbose and (i + 1) % 1000 == 0:

loss = np.mean((self.a2 - y) ** 2)

print(f"epoch {i + 1}, loss={loss:.6f}")

def predict(self, X, threshold=0.5):

"""预测类别"""

prob = self.forward(X)

return (prob >= threshold).astype(int)

if name == "main":

XOR 数据集

X = np.array([

0, 0,

0, 1,

1, 0,

1, 1

], dtype=float)

y = np.array([

0,

1,

1,

0

], dtype=float)

创建 BP 模型:2 输入,4 隐藏神经元,1 输出

bp = BPNeuralNetwork(

input_size=2,

hidden_size=4,

output_size=1,

lr=0.5

)

训练

bp.train(X, y, epochs=10000, verbose=True)

预测概率

print("\n预测概率:")

print(bp.forward(X))

预测类别

print("\n预测类别:")

print(bp.predict(X))

```

运行后会输出类似:

```text

epoch 1000, loss=0.250000

epoch 2000, loss=0.120000

...

预测概率:

\[0.01

0.98

0.98

0.02\]

预测类别:

\[0

1

1

0\]

```

这个模型的核心就是:

  1. 前向传播:输入 → 隐藏层 → 输出层

  2. 计算损失:这里使用均方误差 MSE

  3. 反向传播:从输出层误差逐层往回计算梯度

  4. 梯度下降:更新权重和偏置

  5. 重复训练:直到损失收敛

此文章仅为学习参考用。

相关推荐
Ticnix2 小时前
多租户 RAG:让每个用户只检索到自己的知识库
后端·python·agent
ID34610744202 小时前
【课程设计】基于Spring Boot+Vue的游戏账号租赁系统的设计与实现-计算机毕设 附源码50345
javascript·vue.js·spring boot·python·node.js·php·课程设计
夏雪coding2 小时前
RAG 要不要上向量库:720 个 chunk 用 numpy 点积就够了
python·aigc·ai编程
Ticnix2 小时前
我删了 200 行 if-else,把决策逻辑全写进了 System Prompt
python·llm·agent
谢白羽2 小时前
在4×B300用SGLang部署DeepSeek-V4.1 Flash优化实录
笔记·python·llm·llama·sglang
Y3815326622 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
苏苏susuus2 小时前
核密度估计(KDE)与高斯核(概念分享)
人工智能·python·ocr
宸津-代码粉碎机3 小时前
微服务线上踩坑复盘:接口超时、负载倾斜隐形问题根治方案(生产级配置)
java·大数据·人工智能·python·spring
速易达网络3 小时前
Python + Tkinter 实现基于 TCP/IP 的局域网聊天工具
python·信息与通信