一、项目简介
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数据集 data=meas; %样本数据集 y=zeros(150,1); %将类标签转化为数字 y(strcmp(species,'setosa')) =1; y(strcmp(species,'versicolor'))=2; y(strcmp(species,'virginica')) =3; [train1,test1]=crossvalind('holdout',y); %利用交叉验证随机分割数据集 X_train=data(train1,:);y_train=y(train1); X_train= X_train'; %训练样本 y_train=y_train'; %训练标签 [X_train,PS]=mapminmax(X_train); %归一化处理 %神经网络 net=feedforwardnet(4); %创建一个两层前馈网络.该网络有一个隐含层有4个神经元. net=configure(net,X_train,y_train); %配置内存 %对网络进行训练 net.trainParam.epochs=100;%执行步长为100 net=train(net,X_train,y_train); %训练 %显示相关参数 X1=net(X_train); %训练成果展示 disp('网络训练后的第一层权值为:') ; w1=net.iw{1}; disp('网络训练后的第一层阈值:') ; b1=net.b{1}; disp('网络训练后的第二层权值为:') ; w2=net.Lw{2}; disp('网络训练后的第二层阈值:') ; b2=net.b{2}; %测试集合 X_test=data(test1,:); y_test=y(test1); X_test= X_test'; y_test=y_test'; %目标矩阵 an=y_test; %测试集标签 X2=mapminmax('apply',X_test,PS);%‘‘同一归一化” g=net(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 data=meas; y=zeros(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 字符型类别标签
神经网络无法识别字符标签,因此手动映射为数字标签: setosa=1 、 versicolor=2 、 virginica=3
4.3 数据集随机划分
[train1,test1]=crossvalind('holdout',y);crossvalind :MATLAB交叉验证划分函数
holdout 模式:默认70%训练集、30%测试集随机划分
train1/test1 为逻辑索引矩阵,快速筛选训练、测试样本
4.4 数据维度适配与归一化
X_train= X_train'; y_train=y_train'; [X_train,PS]=mapminmax(X_train);关键知识点:MATLAB神经网络工具箱要求输入数据格式:行为特征、列为样本,因此必须转置矩阵
mapminmax :最大最小归一化函数,将数据压缩至 [-1,1]
PS :保存归一化的极值参数,测试集必须复用该参数,不能单独归一化,否则会出现数据失真、精度失效
4.5 BP网络搭建与参数配置
net=feedforwardnet(4); net=configure(net,X_train,y_train); net.trainParam.epochs=100; net=train(net,X_train,y_train);feedforwardnet(4) :创建双层前馈BP网络,隐含层4个神经元(核心超参数,可自行调整)
configure :自动配置网络输入输出维度、内存空间
epochs=100 :设置最大迭代训练次数为100次,达到次数自动停止训练
4.6 网络参数输出
w1=net.iw{1}; % 输入层-隐含层权值 b1=net.b{1}; % 隐含层阈值 w2=net.Lw{2}; % 隐含层-输出层权值 b2=net.b{2}; % 输出层阈值BP神经网络的核心可学习参数就是权值和阈值,模型训练本质就是迭代优化这四类参数,输出参数可用于模型复盘、移植、二次优化。
4.7 测试集验证与精度计算
X2=mapminmax('apply',X_test,PS); g=net(X2); err=(1-sum(sqrt((an-g).^2)./an)/length(an))*100;mapminmax('apply') :沿用训练集归一化规则处理测试集,保证数据分布一致
g=net(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.epochs=200/500 ,让模型充分收敛
3. 设置学习率:新增 net.trainParam.lr=0.01 ,精细优化参数更新步长
6.3 过拟合优化
1. 开启网络自带数据划分: net.divideFcn = 'dividerand'
2. 添加验证集监控,提前停止训练
七、知识点总结
1. Iris数据集:机器学习三分类入门标准数据集,特征简单、分布均匀
2. BP神经网络核心:前向传播预测、反向传播更新参数
3. 数据预处理准则:训练集、测试集归一化参数必须统一,禁止二次归一化
4. MATLAB建模规范:固定随机种子、维度适配、参数可视化、精度量化评估
八、拓展方向
1. 对比不同隐含层神经元数量的精度差异,寻找最优网络结构
2. 替换训练算法(动量梯度下降、自适应学习率)优化模型
3. 混淆矩阵可视化分类结果,精准分析错分样本
4. 结合遗传算法、粒子群算法优化BP神经网络初始权值,进一步提升精度
博主寄语
本文实现了零门槛、可直接运行的BP神经网络鸢尾花分类代码,全程贴合MATLAB新版工具箱语法,摒弃老旧 newff 函数,适合新手学习神经网络建模流程、理解分类任务逻辑。代码注释齐全、原理通俗,可直接用于课程设计、大作业、入门实验。
欢迎点赞+收藏+关注!
后续持续更新MATLAB神经网络、机器学习、智能算法实战教程,有问题评论区交流~