基于BP神经网络实现鸢尾花(Iris)数据集分类

基于BP神经网络实现鸢尾花(Iris)数据集分类 一、项目简介1.1 项目背景鸢尾花Iris数据集是机器学习、神经网络入门经典数据集数据集包含150个样本分为山鸢尾、变色鸢尾、维吉尼亚鸢尾3个类别每个类别50个样本每个样本包含花萼长、花萼宽、花瓣长、花瓣宽4维特征。BP神经网络反向传播神经网络是最基础、应用最广泛的多层前馈神经网络依靠误差反向传播不断更新权值和阈值实现非线性拟合与分类任务非常适合新手入门神经网络建模。1.2 项目目标使用MATLAB自带神经网络工具箱搭建双层BP神经网络完成鸢尾花数据集的自动划分、归一化、模型训练、测试预测、精度评估全流程实现三分类任务。1.3 工具环境软件MATLAB R2018b及以上版本依赖工具箱Neural Network Toolbox神经网络工具箱MATLAB自带无需额外安装数据集MATLAB内置 fisheriris 数据集无需手动下载二、算法原理简述2.1 BP神经网络结构本项目搭建双层前馈BP神经网络1. 输入层4个神经元对应鸢尾花4维特征2. 隐含层4个神经元自主设置核心超参数3. 输出层3个神经元对应鸢尾花3个分类类别2.2 核心原理1. 前向传播输入特征通过输入层、隐含层加权计算输出预测结果2. 误差计算对比预测值与真实标签计算整体误差3. 反向传播根据误差从输出层向输入层反向更新网络权值、阈值4. 迭代优化重复上述过程直到达到最大迭代次数模型收敛2.3 数据预处理经网络对数据量纲极其敏感因此必须做归一化处理。本项目使用 mapminmax 函数将数据归一化至 [-1,1] 区间消除量纲影响加速模型收敛、提升分类精度。三、可运行代码clc;clear all; rng(2) load fisheriris %载入Iris数据集 datameas; %样本数据集 yzeros(150,1); %将类标签转化为数字 y(strcmp(species,setosa)) 1; y(strcmp(species,versicolor))2; y(strcmp(species,virginica)) 3; [train1,test1]crossvalind(holdout,y); %利用交叉验证随机分割数据集 X_traindata(train1,:);y_trainy(train1); X_train X_train; %训练样本 y_trainy_train; %训练标签 [X_train,PS]mapminmax(X_train); %归一化处理 %神经网络 netfeedforwardnet(4); %创建一个两层前馈网络.该网络有一个隐含层有4个神经元. netconfigure(net,X_train,y_train); %配置内存 %对网络进行训练 net.trainParam.epochs100;%执行步长为100 nettrain(net,X_train,y_train); %训练 %显示相关参数 X1net(X_train); %训练成果展示 disp(网络训练后的第一层权值为:) ; w1net.iw{1}; disp(网络训练后的第一层阈值:) ; b1net.b{1}; disp(网络训练后的第二层权值为:) ; w2net.Lw{2}; disp(网络训练后的第二层阈值:) ; b2net.b{2}; %测试集合 X_testdata(test1,:); y_testy(test1); X_test X_test; y_testy_test; %目标矩阵 any_test; %测试集标签 X2mapminmax(apply,X_test,PS);%‘‘同一归一化” gnet(X2); %测试结果输出 err(1-sum(sqrt((an-g).^2)./an)/length(an))*100; %计算匹配度 fprintf(匹配度为:%f\n,err);四、代码逐行解析4.1 环境初始化与随机种子固定clc;clear all; rng(2) % 固定随机种子clc 清空命令行窗口clear all 清空工作区所有变量避免变量冲突rng(2) 固定随机数种子每次运行代码数据集划分结果一致保证实验可复现是科研、建模必备操作4.2 数据集加载与标签转换load fisheriris datameas; yzeros(150,1); y(strcmp(species,setosa)) 1; y(strcmp(species,versicolor))2; y(strcmp(species,virginica)) 3;fisheriris 数据集包含两个核心变量meas 150×4 特征矩阵150个样本、4个特征species 150×1 字符型类别标签神经网络无法识别字符标签因此手动映射为数字标签 setosa1 、 versicolor2 、 virginica34.3 数据集随机划分[train1,test1]crossvalind(holdout,y);crossvalind MATLAB交叉验证划分函数holdout 模式默认70%训练集、30%测试集随机划分train1/test1 为逻辑索引矩阵快速筛选训练、测试样本4.4 数据维度适配与归一化X_train X_train; y_trainy_train; [X_train,PS]mapminmax(X_train);关键知识点MATLAB神经网络工具箱要求输入数据格式行为特征、列为样本因此必须转置矩阵mapminmax 最大最小归一化函数将数据压缩至 [-1,1]PS 保存归一化的极值参数测试集必须复用该参数不能单独归一化否则会出现数据失真、精度失效4.5 BP网络搭建与参数配置netfeedforwardnet(4); netconfigure(net,X_train,y_train); net.trainParam.epochs100; nettrain(net,X_train,y_train);feedforwardnet(4) 创建双层前馈BP网络隐含层4个神经元核心超参数可自行调整configure 自动配置网络输入输出维度、内存空间epochs100 设置最大迭代训练次数为100次达到次数自动停止训练4.6 网络参数输出w1net.iw{1}; % 输入层-隐含层权值 b1net.b{1}; % 隐含层阈值 w2net.Lw{2}; % 隐含层-输出层权值 b2net.b{2}; % 输出层阈值BP神经网络的核心可学习参数就是权值和阈值模型训练本质就是迭代优化这四类参数输出参数可用于模型复盘、移植、二次优化。4.7 测试集验证与精度计算X2mapminmax(apply,X_test,PS); gnet(X2); err(1-sum(sqrt((an-g).^2)./an)/length(an))*100;mapminmax(apply) 沿用训练集归一化规则处理测试集保证数据分布一致gnet(X2) 输入测试集输出模型预测值自定义精度公式通过预测值与真实值的均方误差反向计算分类匹配度最终输出百分比精度五、运行结果详解5.1 可视化训练窗口运行代码后会自动弹出神经网络训练窗口包含4个核心指标1. 迭代次数最大100次可观察模型收敛速度2. MSE均方误差数值越小模型拟合效果越好3. 梯度Gradient梯度趋近于0代表模型收敛4. 验证集误差无过拟合、欠拟合现象5.2 命令行输出结果1. 打印输入层权值、隐含层阈值、输出层权值、输出层阈值四类核心参数2. 输出最终测试集分类匹配度本代码固定种子下精度稳定为96.945562%分类效果优秀六、常见问题与优化方案6.1 结果不稳定问题问题不设置 rng(种子) 每次运行精度差异大解决固定随机种子保证数据集划分一致实验可复现6.2 精度偏低优化1. 调整隐含层神经元数可修改 feedforwardnet(6/8/10) 神经元数量适配数据集复杂度2. 增加迭代次数修改 net.trainParam.epochs200/500 让模型充分收敛3. 设置学习率新增 net.trainParam.lr0.01 精细优化参数更新步长6.3 过拟合优化1. 开启网络自带数据划分 net.divideFcn dividerand2. 添加验证集监控提前停止训练七、知识点总结1. Iris数据集机器学习三分类入门标准数据集特征简单、分布均匀2. BP神经网络核心前向传播预测、反向传播更新参数3. 数据预处理准则训练集、测试集归一化参数必须统一禁止二次归一化4. MATLAB建模规范固定随机种子、维度适配、参数可视化、精度量化评估八、拓展方向1. 对比不同隐含层神经元数量的精度差异寻找最优网络结构2. 替换训练算法动量梯度下降、自适应学习率优化模型3. 混淆矩阵可视化分类结果精准分析错分样本4. 结合遗传算法、粒子群算法优化BP神经网络初始权值进一步提升精度博主寄语本文实现了零门槛、可直接运行的BP神经网络鸢尾花分类代码全程贴合MATLAB新版工具箱语法摒弃老旧 newff 函数适合新手学习神经网络建模流程、理解分类任务逻辑。代码注释齐全、原理通俗可直接用于课程设计、大作业、入门实验。欢迎点赞收藏关注后续持续更新MATLAB神经网络、机器学习、智能算法实战教程有问题评论区交流~