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. 重复训练:直到损失收敛

此文章仅为学习参考用。

相关推荐
北冥有鱼被烹35 分钟前
砷化镓与磷化铟:光模块的地基——从化学键到AI缺货潮的底层逻辑
人工智能·python
for_ever_love__2 小时前
线性回归与梯度下降——从零手写一个模型
python·机器学习·线性回归·梯度下降
code_whiter2 小时前
7.自动化测试常用函数
python·功能测试
小园子的小菜2 小时前
Python协程深度解析:从原理演进到实战避坑
后端·python
砚底藏山河2 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven
GitFun3 小时前
给策略加了条-8%止损线,11年只触发1次
python·股票·量化交易
马六六i3 小时前
市面上正规的IP驱动产业新场景新工具有哪些
大数据·网络·python·tcp/ip
I Am a robert girl4 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
天若有情6735 小时前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang
打工仔折腾 AI5 小时前
System Prompt 替代 Few-shot:用规则约束大模型输出的省钱实践
java·人工智能·python·spring·langchain·prompt·ai agent 实战