用bp神经网络实现鸢尾花分类的Python代码
时间: 2024-11-13 20:18:41 浏览: 3
人工智能-项目实践-鸢尾花分类-Python 基于BP神经网络实现鸢尾花的分类
5星 · 资源好评率100%
用BP神经网络(Back Propagation Neural Network)对鸢尾花数据集进行分类,我们可以借助一些库如`sklearn`, `numpy`以及自定义的BP学习算法。下面是一个简单的示例代码:
```python
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理(归一化)
X = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 设定神经网络结构
input_nodes = X_train.shape[1]
hidden_nodes = 5 # 这里假设有一个隐藏层,可以调整节点数
output_nodes = len(np.unique(y)) # 鸢尾花有三种类别
# 初始化权重矩阵
w1 = np.random.rand(input_nodes, hidden_nodes)
w2 = np.random.rand(hidden_nodes, output_nodes)
# 定义BP学习函数(简化版)
def backpropagation(x, t, w1, w2, learning_rate):
m = x.shape[0] # 样本数量
z1 = np.dot(x, w1) # 第一层隐藏节点的输入
a1 = sigmoid(z1) # 激活函数(这里用sigmoid)
z2 = np.dot(a1, w2) # 输出层的输入
a2 = softmax(z2) # 输出概率值,使用softmax保证总和为1
# 计算误差和梯度
delta2 = a2 - t.reshape(-1, 1) # 输出层误差
dZ2 = delta2 * a2 * (1 - a2) # 输出层导数
dw2 = (1/m) * np.dot(a1.T, dZ2) # 输出层权重更新
error = np.sum(delta2**2) / m # 平均误差平方
delta1 = np.dot(dZ2, w2.T) * sigmoid_derivative(z1) # 隐藏层误差
dw1 = (1/m) * np.dot(x.T, delta1) # 隐藏层权重更新
# 更新权重
w1 -= learning_rate * dw1
w2 -= learning_rate * dw2
return error, dw1, dw2
def sigmoid_derivative(z): # Sigmoid激活函数的导数
return z * (1 - z)
# 定义训练过程
learning_rate = 0.1
epochs = 1000
for _ in range(epochs):
errors, _, _ = [], [], []
for i in range(X_train.shape[0]):
x = X_train[i].reshape(1, -1)
t = one_hot_encode(y_train[i]) # 将标签转换为one-hot编码
error, dw1, dw2 = backpropagation(x, t, w1, w2, learning_rate)
errors.append(error)
_, dw1_, dw2_ = backpropagation(x, t, w1, w2, learning_rate)
_, dw1[-1], dw2[-1] = dw1_, dw2_
dw1, dw2 = dw1[:-1], dw2[:-1] # 省略最后一个节点的权重更新
errors.append(error)
_, _, _ = backpropagation(x, t, w1, w2, learning_rate)
print(f"Epoch {_:03d}: Mean Error = {np.mean(errors)}")
# 测试阶段
predictions = []
for x in X_test:
x = x.reshape(1, -1)
o = predict(x, w1, w2) # 使用预测函数
predictions.append(np.argmax(o))
# 评估模型性能
accuracy = np.mean(predictions == y_test)
print(f"Accuracy: {accuracy}")
# 预测函数(假设我们只关心最大概率对应的类别)
def predict(x, w1, w2):
z1 = np.dot(x, w1)
a1 = sigmoid(z1)
z2 = np.dot(a1, w2)
return softmax(z2)
```
在这个代码中,我们首先加载鸢尾花数据并做了一些基本预处理。然后定义了一个简单的BP神经网络,并通过迭代训练来优化权重。最后,我们用测试集评估了模型的性能。
注意这只是一个基础的示例,实际应用中可能需要更复杂的网络结构、正则化和批量梯度下降等优化手段。另外,这里的`softmax`和`one_hot_encode`函数没有直接提供,你需要自己实现它们。
阅读全文