用python实现在2个属性,5个样本的西瓜数据上,BP网络参数更新和分类边界的变化的代码
时间: 2024-05-04 08:15:51 浏览: 116
以下是一个简单的BP神经网络实现在西瓜数据集上的代码:
```python
import numpy as np
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义BP神经网络类
class BPNN:
def __init__(self, input_dim, hidden_dim, output_dim):
# 初始化权重
self.W1 = np.random.randn(input_dim, hidden_dim)
self.b1 = np.random.randn(hidden_dim)
self.W2 = np.random.randn(hidden_dim, output_dim)
self.b2 = np.random.randn(output_dim)
# 前向传播
def forward(self, X):
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = sigmoid(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
self.a2 = sigmoid(self.z2)
return self.a2
# 反向传播
def backward(self, X, y, learning_rate):
# 计算输出层误差
delta2 = (self.a2 - y) * self.a2 * (1 - self.a2)
# 计算隐藏层误差
delta1 = np.dot(delta2, self.W2.T) * self.a1 * (1 - self.a1)
# 更新权重
self.W2 -= learning_rate * np.dot(self.a1.T, delta2)
self.b2 -= learning_rate * np.sum(delta2, axis=0)
self.W1 -= learning_rate * np.dot(X.T, delta1)
self.b1 -= learning_rate * np.sum(delta1, axis=0)
# 加载数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 初始化模型
model = BPNN(2, 4, 1)
# 训练模型
for i in range(10000):
# 前向传播
y_pred = model.forward(X)
# 反向传播
model.backward(X, y, 0.1)
# 计算误差
loss = np.mean((y_pred - y) ** 2)
# 打印误差
if i % 1000 == 0:
print(f"Epoch {i}, Loss: {loss:.4f}")
# 打印分类边界
X1 = np.linspace(0, 1, 100)
X2 = np.linspace(0, 1, 100)
X1, X2 = np.meshgrid(X1, X2)
X_test = np.array([X1.ravel(), X2.ravel()]).T
y_test = model.forward(X_test)
y_test = y_test.reshape(X1.shape)
plt.contour(X1, X2, y_test, levels=[0.5])
plt.scatter(X[:,0], X[:,1], c=y.ravel())
plt.show()
```
在这个例子中,我们使用了一个包含2个输入节点、4个隐藏节点和1个输出节点的BP神经网络。我们使用sigmoid作为激活函数,并使用均方误差作为损失函数。我们使用随机梯度下降算法来更新权重。
在训练完模型后,我们可以使用模型来预测新的数据,并使用分类边界来可视化模型的分类效果。
阅读全文