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准确率
总结
- maxminmap归一化函数和netff函数的输入矩阵都是==”行特征,列样本“==的格式,注意转置
- BP实现分类时,Y为分类变量,预处理时需要将其转换成独热编码,sim后将得到的类别概率转换成分类数值,可通过以下函数实现:
ind2vec:1×120 --> 3×120(转成独热编码,稀疏矩阵)
vec2ind:3×120 --> 1×120 (取每一列概率分布值的max) - 多次训练时,应保证随机选取样本不变(不要一次运行所有代码)