基于鸢尾花数据集的BP神经网络分类算法实现

本项目使用Python实现一个三层BP神经网络模型,并使用鸢尾花数据集进行分类训练和测试,展示损失函数和准确率的曲线变化。模型内部代码实现,不直接调用库函数。

1. 导入库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2. 读取数据集

data = pd.read_csv('iris.csv')

3. 数据预处理

将数据集中的类别标签转换为数值标签:

data['Species'] = data['Species'].replace({'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})

将数据集划分为训练集和测试集:

train_data = data.sample(frac=0.7, random_state=0)
test_data = data.drop(train_data.index)

4. 定义sigmoid函数和其导数

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

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

5. 定义神经网络类

class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size, learning_rate):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.learning_rate = learning_rate
        
        # 初始化权重和偏置
        self.weights1 = np.random.randn(self.input_size, self.hidden_size)
        self.bias1 = np.zeros((1, self.hidden_size))
        self.weights2 = np.random.randn(self.hidden_size, self.output_size)
        self.bias2 = np.zeros((1, self.output_size))
        
    def forward(self, X):
        # 前向传播
        self.z1 = np.dot(X, self.weights1) + self.bias1
        self.a1 = sigmoid(self.z1)
        self.z2 = np.dot(self.a1, self.weights2) + self.bias2
        self.a2 = sigmoid(self.z2)
        
    def backward(self, X, y):
        # 反向传播
        self.error = self.a2 - y
        self.delta2 = self.error * sigmoid_derivative(self.z2)
        self.delta1 = np.dot(self.delta2, self.weights2.T) * sigmoid_derivative(self.z1)
        self.weights2 -= self.learning_rate * np.dot(self.a1.T, self.delta2)
        self.bias2 -= self.learning_rate * np.sum(self.delta2, axis=0, keepdims=True)
        self.weights1 -= self.learning_rate * np.dot(X.T, self.delta1)
        self.bias1 -= self.learning_rate * np.sum(self.delta1, axis=0)

    def train(self, X, y, epochs):
        self.losses = []
        self.accuracies = []
        for i in range(epochs):
            self.forward(X)
            loss = -np.mean(y * np.log(self.a2) + (1 - y) * np.log(1 - self.a2))
            accuracy = np.mean(np.argmax(self.a2, axis=1) == np.argmax(y, axis=1))
            self.losses.append(loss)
            self.accuracies.append(accuracy)
            self.backward(X, y)

    def predict(self, X):
        self.forward(X)
        return np.argmax(self.a2, axis=1)

6. 定义训练函数和测试函数

def train_nn(train_data, input_size, hidden_size, output_size, learning_rate, epochs):
    X_train = train_data.drop('Species', axis=1).values
    y_train = pd.get_dummies(train_data['Species']).values
    nn = NeuralNetwork(input_size, hidden_size, output_size, learning_rate)
    nn.train(X_train, y_train, epochs)
    return nn

def test_nn(nn, test_data):
    X_test = test_data.drop('Species', axis=1).values
    y_test = pd.get_dummies(test_data['Species']).values
    y_pred = nn.predict(X_test)
    accuracy = np.mean(y_pred == np.argmax(y_test, axis=1))
    return accuracy

7. 训练和测试模型

input_size = 4
hidden_size = 10
output_size = 3
learning_rate = 0.1
epochs = 1000

nn = train_nn(train_data, input_size, hidden_size, output_size, learning_rate, epochs)
accuracy = test_nn(nn, test_data)
print('Accuracy:', accuracy)

8. 绘制损失函数和准确率曲线

plt.plot(nn.losses)
plt.title('Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()

plt.plot(nn.accuracies)
plt.title('Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.show()

9. 总结

通过训练和测试,可以观察到损失函数随着训练次数的增加而下降,准确率逐渐上升,最终达到了较高的分类准确率。该项目展示了如何使用Python实现一个简单的BP神经网络模型,并将其应用于鸢尾花数据集的分类任务。

基于鸢尾花数据集的BP神经网络分类算法实现

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

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