matlab BP神经网络对iris数据集进行分类

iris数据集

本文所用数据集👉👉👉iris分类数据集

1.数据预处理

%% 1.数据预处理
oridata=readtable('Iris.xls','Sheet','Sheet1');
X=table2array(oridata(:,(1:4))); % X转化为array类型
Y=table2array(oridata(:,5));  % Y因为包含中文字符,默认会转化为cell类型
allSample_Num=length(Y); %样本数量

% 中文分类变量转换为数字分类变量  确保这里Y是cell类型
for ii = 1:numel(Y)
    if strcmp(Y{ii}, 'Iris-setosa')
        Y{ii} = 1;
    elseif strcmp(Y{ii}, 'Iris-versicolor')
        Y{ii} = 2;
    elseif strcmp(Y{ii}, 'Iris-virginica')
        Y{ii} = 3;
    end
end
Y=cell2mat(Y); % 将Y转换为array类型

2.设置test和train

test_Ratio=0.2; % 测试集比例

c = cvpartition(allSample_Num, 'HoldOut', test_Ratio); % 通过交叉验证的划分对象进行随机划分
trainIdx=training(c); % logistics数组,值1表示被选取 
testIdx=test(c);  % sum(testIdx) == allSample_Num*0.2

X_train=X(trainIdx,:)'; % why转置?——适应netff函数和mapminmax函数的输入要求(行-特征、列-样本)
X_test=X(testIdx,:)';
Y_train=Y(trainIdx,:)';
Y_test=Y(testIdx,:)';

3.数据归一化

%% 3.数据归一化
[X_train_std, X_train_stdps]=mapminmax(X_train,-1,1);  % X_train归一化
% [Y_train_std, Y_train_stdps]=mapminmax(Y_train);
X_test_std=mapminmax('apply',X_test,X_train_stdps);  % X_test采用和X_train一样的归一化方式
Y_train_OneHot=ind2vec(Y_train); % ind2vec 转为独热编码
Y_test_OneHot=ind2vec(Y_test);

4.设定net参数

MSE=1e+10;  % 最优均方误差,初始化一个极大值
hid_Num=0;  % 最优hidden层数目,初始化为0
transF_func={'tansig','purelin'}; % hidden层和out层的激活函数
btf_func='trainlm';  % 反向传播:学习参数的方法(梯度下降)
lr=0.01; % 学习率
epochs=500;   % 训练次数
goal=0.001; % 收敛误差(均方误差)

5.构建、训练net

net=newff(X_train_std, Y_train_OneHot, 4, transF_func, btf_func);
net.trainParam.lr=lr;
net.trainParam.epochs=epochs;
net.trainParam.goal=goal;
net.trainparam.show = 50 ;% 显示中间结果的周期
net=train(net, X_train_std, Y_train_OneHot);

6.结果测试

res_Train=sim(net,X_train_std); % 3×120,每个样本的各类别概率
res_Test=sim(net,X_test_std);   % 3×30,每个样本的各类别概率

res_Train=vec2ind(res_Train); % 1×120,反归一化,找到分类概率最大的所在分类
res_Test=vec2ind(res_Test); % 1×30,反归一化,找到分类概率最大的所在分类

acu_Train=sum(res_Train==Y_train)/allSample_Num*100 % train准确率
acu_Test=sum(res_Test==Y_test)/(allSample_Num*test_Ratio)*100 % test准确率

总结

  1. maxminmap归一化函数和netff函数的输入矩阵都是==”行特征,列样本“==的格式,注意转置
  2. BP实现分类时,Y为分类变量,预处理时需要将其转换成独热编码,sim后将得到的类别概率转换成分类数值,可通过以下函数实现:
    ind2vec:1×120 --> 3×120(转成独热编码,稀疏矩阵)
    vec2ind:3×120 --> 1×120 (取每一列概率分布值的max)
  3. 多次训练时,应保证随机选取样本不变(不要一次运行所有代码)
  4. 在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab是一款功能强大的编程平台,适用于各种科学计算和数据分析任务。在Matlab中,我们可以使用BP神经网络进行iris(鸢尾花)数据的分类。 首先,我们需要导入iris数据集Matlab中具有内置的数据集,可以轻松加载iris数据集。我们可以使用"load fisheriris"命令将数据加载到工作空间中。 接下来,我们需要准备数据进行训练和测试。通常,我们将数据集划分为训练集和测试集,以便对神经网络进行训练和评估。我们可以使用“cvpartition”函数来划分数据集。该函数可以根据我们的要求进行随机划分,或者根据特定类别的样本数目进行划分。 然后,我们需要选择神经网络的结构。BP神经网络由输入层、隐藏层和输出层组成。我们可以使用“patternnet”函数创建一个具有指定隐藏层数和神经元数的网络。对于iris数据集,我们可以选择一个包含4个输入神经元、一个隐藏层(可以根据实际需要选择神经元数目)和3个输出神经元的网络。 接下来,我们需要训练BP神经网络Matlab提供了“train”函数来对神经网络进行训练。我们可以指定训练算法、最大训练周期数和错误容差等训练参数。训练过程会根据给定的数据集进行迭代优化,以找到最佳的权重和偏差。 最后,我们可以使用训练好的神经网络对测试集进行分类预测。我们可以使用“sim”函数来对网络进行仿真,得到每个样本属于各个类别的概率。然后,我们可以根据最大概率确定每个样本的分类。 通过Matlab中的BP神经网络,我们可以对iris数据集进行分类。这种方法不仅简单高效,而且可以为我们提供准确性较高的分类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值