用python实现在2个属性,5个样本的西瓜数据上,BP网络参数更新和分类边界的变化 的代码
时间: 2024-05-15 21:20:09 浏览: 51
以下是实现在2个属性,5个样本的西瓜数据上,BP网络参数更新和分类边界的变化的Python代码示例:
```python
import numpy as np
# 定义数据
X = np.array([[0.2, 0.5], [0.1, 0.4], [0.4, 0.6], [0.9, 0.3], [0.8, 0.1]])
Y = np.array([0, 0, 0, 1, 1])
# 定义神经网络结构
input_size = 2
hidden_size = 3
output_size = 1
# 初始化权值
W1 = np.random.randn(input_size, hidden_size)
W2 = np.random.randn(hidden_size, output_size)
# 定义激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义损失函数
def loss(y_pred, y_true):
return np.mean((y_pred - y_true) ** 2)
# 定义训练函数
def train(X, Y, W1, W2, lr=0.1, epochs=1000):
for i in range(epochs):
# 前向传播
H = sigmoid(np.dot(X, W1))
Y_pred = sigmoid(np.dot(H, W2))
# 反向传播
dY = Y_pred - Y
dW2 = np.dot(H.T, dY * Y_pred * (1 - Y_pred))
dH = np.dot(dY * Y_pred * (1 - Y_pred), W2.T)
dW1 = np.dot(X.T, dH * H * (1 - H))
# 更新权值
W2 -= lr * dW2
W1 -= lr * dW1
# 输出损失函数值
if i % 100 == 0:
print("Epoch %d, Loss %.4f" % (i, loss(Y_pred, Y)))
# 返回训练后的权值
return W1, W2
# 训练神经网络
W1, W2 = train(X, Y, W1, W2)
# 绘制分类边界
import matplotlib.pyplot as plt
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
X_test = np.c_[xx.ravel(), yy.ravel()]
H_test = sigmoid(np.dot(X_test, W1))
Y_pred_test = sigmoid(np.dot(H_test, W2))
Z = Y_pred_test.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
plt.show()
```
希望对您有帮助!
阅读全文