项目简介本项目是一个基于Python的完整神经网络实战案例旨在通过构建一个双层全连接神经网络输入层-隐藏层-输出层解决经典的二分类问题。项目涵盖了从数据生成、模型构建、训练优化到结果可视化的全流程适合作为机器学习入门教程或算法验证的基础平台。核心功能数据模拟与预处理利用Scikit-Learn生成带有噪声的二分类数据集并自动划分为训练集与测试集。神经网络构建手写神经网络类包含前向传播与反向传播算法支持自定义隐藏层节点数与学习率。模型训练与监控通过梯度下降法优化损失函数并实时记录训练过程中的Loss变化。结果可视化绘制决策边界与损失曲线直观展示模型的分类效果与收敛情况。技术栈编程语言Python 3.x核心库NumPy矩阵运算、Matplotlib数据可视化、Scikit-Learn数据处理项目结构项目主要由一个Python脚本构成逻辑清晰易于扩展。数据生成模块make_classification生成模拟数据。模型定义模块NeuralNetwork类封装了网络结构与训练逻辑。训练与评估模块主程序负责调用模型进行训练并输出准确率。运行指南环境准备确保已安装Python环境及必要的第三方库。可以通过以下命令安装依赖bashpip install numpy matplotlib scikit-learn运行项目直接运行主脚本文件bashpython sets.pyimport numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # --- 1. 定义神经网络类 (必须在使用之前定义) --- class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): # 初始化权重和偏置 # 使用随机数初始化种子固定以保证结果可复现 np.random.seed(42) 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 sigmoid(self, z): # 防止溢出 z np.clip(z, -500, 500) return 1 / (1 np.exp(-z)) def sigmoid_derivative(self, a): return a * (1 - a) def forward(self, X): # 前向传播 self.z1 np.dot(X, self.W1) self.b1 self.a1 self.sigmoid(self.z1) self.z2 np.dot(self.a1, self.W2) self.b2 self.a2 self.sigmoid(self.z2) return self.a2 def train(self, X, y, learning_rate, epochs): losses [] m X.shape[0] for i in range(epochs): # 前向传播 output self.forward(X) # 计算损失 (均方误差) loss np.mean((y - output) ** 2) losses.append(loss) # 反向传播 dz2 (output - y) * self.sigmoid_derivative(output) dW2 np.dot(self.a1.T, dz2) / m db2 np.sum(dz2, axis0, keepdimsTrue) / m da1 np.dot(dz2, self.W2.T) dz1 da1 * self.sigmoid_derivative(self.a1) dW1 np.dot(X.T, dz1) / m db1 np.sum(dz1, axis0, keepdimsTrue) / m # 更新参数 self.W1 - learning_rate * dW1 self.b1 - learning_rate * db1 self.W2 - learning_rate * dW2 self.b2 - learning_rate * db2 # 每100次打印一次进度 if i % 100 0: print(fEpoch {i}, Loss: {loss:.4f}) return losses # --- 2. 主程序开始 --- if __name__ __main__: # 设置中文字体支持 (防止画图报错) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False print(1. 生成模拟数据集...) # 生成二分类数据集 X, y make_classification(n_samples1000, n_features2, n_informative2, n_redundant0, n_clusters_per_class1, random_state42) y y.reshape(-1, 1) # 转换形状 # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 可视化数据集 plt.figure(figsize(8, 6)) plt.scatter(X[:, 0], X[:, 1], cy.flatten(), cmapcoolwarm, edgecolork, s40) plt.title(模拟数据集分布) plt.xlabel(特征 1) plt.ylabel(特征 2) plt.savefig(dataset_visualization.png) print( - 数据集图片已保存: dataset_visualization.png) plt.close() print(\n2. 训练神经网络模型...) # 关键修正点input_size 必须是整数取 shape 的第一个元素特征数量 input_size X_train.shape[1] hidden_size 10 # 隐藏层神经元数量 output_size 1 # 输出层二分类 learning_rate 0.5 epochs 1000 # 实例化网络 (这里之前报错是因为找不到类或参数类型不对) nn NeuralNetwork(input_size, hidden_size, output_size) # 开始训练 losses nn.train(X_train, y_train, learning_rate, epochs) # --- 3. 结果评估与可视化 --- print(\n3. 评估模型...) train_pred nn.forward(X_train) train_pred_labels (train_pred 0.5).astype(int) train_acc np.mean(train_pred_labels y_train) print(f训练集准确率: {train_acc * 100:.2f}%) test_pred nn.forward(X_test) test_pred_labels (test_pred 0.5).astype(int) test_acc np.mean(test_pred_labels y_test) print(f测试集准确率: {test_acc * 100:.2f}%) # 绘制损失曲线 plt.figure(figsize(8, 5)) plt.plot(losses) plt.title(训练损失曲线 (Loss Curve)) plt.xlabel(Epoch) plt.ylabel(Loss) plt.grid(True) plt.savefig(loss_curve.png) print( - 损失曲线图片已保存: loss_curve.png) plt.show()预期输出程序运行后将输出训练过程中的损失值Loss变化并在结束后生成两张图片dataset_visualization.png原始数据分布图。decision_boundary.png模型训练后的分类决策边界图。初始化__init__随机初始化权重矩阵 WW 和偏置 bb 打破对称性。激活函数sigmoid引入非线性因素将输出压缩至(0,1)区间用于二分类概率预测。前向传播forward计算 ZW⋅XbZW⋅Xb 并通过激活函数得到预测值 Y^Y^ 。反向传播backward利用链式法则计算梯度更新权重以最小化均方误差或交叉熵损失。增加激活函数选项支持ReLU、Tanh等激活函数对比不同函数对收敛速度的影响。引入正则化添加L2正则化项防止模型过拟合。多分类支持修改输出层为Softmax支持MNIST等手写数字识别等多分类任务。动态绘图使用matplotlib.animation实现训练过程中决策边界的动态演变展示。