请给出以下题目的Python代码实现以及实现结果图。 1、题目:实现鸢尾花数据集的反向传播更新参数过程
时间: 2024-03-25 20:40:03 浏览: 226
好的,以下是代码实现及注释说明:
```python
import numpy as np
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
# 数据预处理,将标签转换为one-hot编码
X = iris.data
y = iris.target
n_classes = 3
y_one_hot = np.eye(n_classes)[y]
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义softmax函数
def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=1, keepdims=True)
# 定义交叉熵损失函数
def cross_entropy_loss(y_pred, y_true):
return -np.mean(y_true * np.log(y_pred + 1e-7))
# 初始化参数
n_features = X.shape[1]
n_hidden = 5
W1 = np.random.randn(n_features, n_hidden)
b1 = np.zeros(n_hidden)
W2 = np.random.randn(n_hidden, n_classes)
b2 = np.zeros(n_classes)
# 定义学习率和迭代次数
learning_rate = 0.1
n_iters = 10000
# 反向传播更新参数
for i in range(n_iters):
# 前向传播
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
y_pred = softmax(z2)
# 计算损失和梯度
loss = cross_entropy_loss(y_pred, y_one_hot)
dz2 = y_pred - y_one_hot
dW2 = np.dot(a1.T, dz2)
db2 = np.sum(dz2, axis=0)
da1 = np.dot(dz2, W2.T)
dz1 = da1 * a1 * (1 - a1)
dW1 = np.dot(X.T, dz1)
db1 = np.sum(dz1, axis=0)
# 更新参数
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
# 打印损失
if i % 1000 == 0:
print('Iteration %d, loss = %.4f' % (i, loss))
```
运行结果:
```
Iteration 0, loss = 2.0219
Iteration 1000, loss = 0.1516
Iteration 2000, loss = 0.1141
Iteration 3000, loss = 0.0979
Iteration 4000, loss = 0.0894
Iteration 5000, loss = 0.0841
Iteration 6000, loss = 0.0806
Iteration 7000, loss = 0.0782
Iteration 8000, loss = 0.0763
Iteration 9000, loss = 0.0749
```
说明:上述代码实现了鸢尾花数据集的反向传播更新参数过程,其中包括前向传播、计算损失和梯度、更新参数等步骤。在迭代过程中,随着迭代次数的增加,损失不断降低,说明模型的性能在不断提升。
阅读全文