基于鸢尾花数据集的BP神经网络分类算法实现
基于鸢尾花数据集的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神经网络模型,并将其应用于鸢尾花数据集的分类任务。
原文地址: https://www.cveoy.top/t/topic/jrEK 著作权归作者所有。请勿转载和采集!