基于BP神经网络的鸢尾花分类:实现与性能分析

本文使用Python实现一个3层的BP神经网络,通过训练鸢尾花数据集来进行分类。模型的实现包含前向传播、反向传播和训练过程,并可视化损失函数和准确率的变化趋势,最终达到较高的分类准确率。

1. 算法原理

BP神经网络是一种常用的前馈神经网络,它通过反向传播算法来调整网络权重,以最小化损失函数。

  • 前向传播:将输入数据通过神经网络层层传递,计算每一层的输出值。
  • 反向传播:根据输出值与目标值的差异,计算每一层网络的误差,并根据误差反向传播调整网络权重。

2. 代码实现

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def sigmoid_derivative(x):
    return x * (1 - x)


def softmax(x):
    exp_x = np.exp(x)
    return exp_x / np.sum(exp_x, axis=1, keepdims=True)


class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.W1 = np.random.randn(input_size, hidden_size)
        self.b1 = np.zeros((1, hidden_size))
        self.W2 = np.random.randn(hidden_size, output_size)
        self.b2 = np.zeros((1, output_size))

    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 = softmax(self.z2)
        return self.a2

    def backward(self, X, y, learning_rate):
        m = X.shape[0]

        dZ2 = self.a2 - y
        dW2 = np.dot(self.a1.T, dZ2) / m
        db2 = np.sum(dZ2, axis=0, keepdims=True) / m

        dZ1 = np.dot(dZ2, self.W2.T) * sigmoid_derivative(self.a1)
        dW1 = np.dot(X.T, dZ1) / m
        db1 = np.sum(dZ1, axis=0, keepdims=True) / m

        self.W2 -= learning_rate * dW2
        self.b2 -= learning_rate * db2
        self.W1 -= learning_rate * dW1
        self.b1 -= learning_rate * db1

    def train(self, X, y, learning_rate=0.1, epochs=1000):
        loss_history = []
        accuracy_history = []

        for i in range(epochs):
            a2 = self.forward(X)
            loss = -np.sum(y * np.log(a2)) / X.shape[0]
            loss_history.append(loss)

            correct_predictions = np.sum(np.argmax(a2, axis=1) == np.argmax(y, axis=1))
            accuracy = correct_predictions / X.shape[0]
            accuracy_history.append(accuracy)

            self.backward(X, y, learning_rate)

        return loss_history, accuracy_history


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

# 对类别进行one-hot编码
y_onehot = np.zeros((y.shape[0], 3))
y_onehot[np.arange(y.shape[0]), y.reshape(-1)] = 1

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)

# 初始化神经网络
nn = NeuralNetwork(input_size=4, hidden_size=10, output_size=3)

# 训练神经网络
loss_history, accuracy_history = nn.train(X_train, y_train, learning_rate=0.1, epochs=1000)

# 测试神经网络
y_pred = np.argmax(nn.forward(X_test), axis=1)
y_true = np.argmax(y_test, axis=1)
accuracy = np.sum(y_pred == y_true) / y_test.shape[0]
print('Test accuracy:', accuracy)

# 绘制损失和准确率曲线
plt.plot(loss_history)
plt.title('Loss')
plt.show()

plt.plot(accuracy_history)
plt.title('Accuracy')
plt.show()

3. 实验结果

经过1000次迭代后,神经网络的准确率达到100%。

loss accuracy

4. 结论

本文使用Python实现了一个3层的BP神经网络,并利用鸢尾花数据集进行分类。实验结果表明,经过训练后模型能够达到较高的分类准确率,并且损失函数和准确率曲线变化趋势也符合预期。

5. 讨论

  • 为了进一步提高模型的准确率,可以尝试增加神经网络的层数或隐层神经元的数量,并调整学习率和迭代次数等参数。
  • 可以使用更复杂的激活函数,如ReLU函数,以提高模型的非线性拟合能力。
  • 可以尝试使用其他优化算法,例如Adam优化器,以加速模型的训练过程。

6. 代码改进

  • 添加代码注释,解释每个代码段的功能。
  • 使用更规范的代码结构,提高代码可读性。
  • 使用更简洁的代码风格,例如使用列表推导和函数式编程。
  • 添加错误处理机制,提高代码的鲁棒性。
  • 使用单元测试,验证代码的正确性。
  • 使用版本控制工具,例如Git,管理代码版本。

7. 未来工作

  • 将BP神经网络应用于其他机器学习任务,例如图像分类、语音识别等。
  • 研究更先进的神经网络模型,例如卷积神经网络(CNN)和循环神经网络(RNN)。
  • 将深度学习技术与其他技术结合,例如自然语言处理、计算机视觉等。
基于BP神经网络的鸢尾花分类:实现与性能分析

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

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