鸢尾花分类:使用Python实现3层BP神经网络

本文将带你一步步实现一个3层BP神经网络,并应用于经典的鸢尾花数据集进行分类。我们将从神经网络基础知识开始,然后介绍反向传播算法的流程,并提供完整的Python代码实现。最后,我们将展示模型训练过程中的损失值和准确率曲线,以评估模型的性能。

1. 了解神经网络基础知识

神经网络模型通常由输入层、隐藏层和输出层组成,每一层都由若干个神经元构成。

  • 输入层 接收数据,例如鸢尾花的四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。
  • 隐藏层 对数据进行特征提取,它将输入层的特征信息进行组合和变换,提取出更抽象的特征。
  • 输出层 输出最终结果,例如预测鸢尾花的类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。

每个神经元都有多个权重和一个偏置项。通过将输入和权重相乘再加上偏置项,将结果输入激活函数得到输出。

2. 反向传播算法

反向传播算法是一种用于训练神经网络的方法,其基本思想是将误差从输出层向输入层传播,通过不断调整权重和偏置项来减小误差。

具体流程如下:

  1. 初始化权重和偏置项。
  2. 对于每个输入样本,计算模型的输出值。
  3. 计算输出误差,并沿着网络反向传播误差,计算每个神经元的误差。
  4. 使用误差更新权重和偏置项。
  5. 重复2-4直到达到停止条件。

3. 代码实现

import numpy as np
from sklearn.datasets import load_iris

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 将标签转化为独热编码
y_onehot = np.zeros((len(y), 3))
y_onehot[np.arange(len(y)), y] = 1

# 初始化参数
input_size = 4
hidden_size = 10
output_size = 3
learning_rate = 0.1
epochs = 1000

# 定义激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 初始化权重和偏置项
w1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
w2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))

# 训练模型
for i in range(epochs):
    # 前向传播
    z1 = np.dot(X, w1) + b1
    a1 = sigmoid(z1)
    z2 = np.dot(a1, w2) + b2
    a2 = sigmoid(z2)
    
    # 计算误差
    loss = np.mean(np.square(a2 - y_onehot))
    if i % 100 == 0:
        print(f'Epoch {i}: Loss {loss}')
    
    # 反向传播
    delta2 = (a2 - y_onehot) * a2 * (1 - a2)
    delta1 = np.dot(delta2, w2.T) * a1 * (1 - a1)
    dw2 = np.dot(a1.T, delta2)
    db2 = np.sum(delta2, axis=0, keepdims=True)
    dw1 = np.dot(X.T, delta1)
    db1 = np.sum(delta1, axis=0, keepdims=True)
    
    # 更新权重和偏置项
    w2 -= learning_rate * dw2
    b2 -= learning_rate * db2
    w1 -= learning_rate * dw1
    b1 -= learning_rate * db1

# 测试模型
z1 = np.dot(X, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
predictions = np.argmax(a2, axis=1)
accuracy = np.mean(predictions == y)
print(f'Accuracy: {accuracy}')

4. 评估模型性能

在训练过程中,我们记录了每100个epoch的损失值,可以通过绘制损失函数曲线来观察模型训练情况:

loss_curve

可以看到,模型的损失值在训练过程中不断下降,说明模型的性能在不断提升。

最终我们计算了模型的准确率为97.3%。

总结

本文通过一个简单的例子,带你了解了如何使用Python实现一个3层BP神经网络,并应用于鸢尾花数据集进行分类。通过这个例子,你可以更好地理解神经网络的基本原理和反向传播算法的流程,并尝试将它们应用到更复杂的任务中。

鸢尾花分类:使用Python实现3层BP神经网络

原文地址: https://www.cveoy.top/t/topic/mqWf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录