1、使用鸢尾花数据分为2组,每组各75个样本,每组中每种花各有25个样本。当中一组作为训练样本,另外一组作为测试样本,将3类花分别编号为1,2,3 ,实现神经网络实验;
2、分析网络层数及节点数对分类精度的影响;
clear;clc;
%% 导入鸢尾花数据,并将3类花分别编号为1,2,3
iris = readtable('iris.data','Filetype','text','ReadVariableNames',false);
pattern=iris{:,1:4};
target=iris{:,5};
for i=1:size(pattern,1)
if strcmp(target(i,1),'Iris-setosa')
label(i,1)=1;
elseif strcmp(target(i,1),'Iris-versicolor')
label(i,1)=2;
else
label(i,1)=3;
end;
end
iris=[pattern,label];
%% 数据分为2组,每组各75个样本,每组中每种花各有25个样本
ind=randperm(50);
ind_1=ind(1:25);
ind_2=ind(26:50);
iris_1=[];iris_2=[];iris_3=[];
for i=1:size(iris,1)
if iris(i,5)==1
iris_1=[iris_1;iris(i,:)];
elseif iris(i,5)==2
iris_2=[iris_2;iris(i,:)];
elseif iris(i,5)==3
iris_3=[iris_3;iris(i,:)];
end
end
Test=[iris_1(ind_1,:);iris_2(ind_1,:);iris_3(ind_1,:)];
Train=[iris_1(ind_2,:);iris_2(ind_2,:);iris_3(ind_2,:)];
pattern_train=Train(:,1:4);
label_train=Train(:,5);
pattern_test=Test(:,1:4);
label_test=Test(:,5);
%% 构造神经网络
% ①训练集归一化
[input,minl,maxl]=premnmx(pattern_train');
% ②构造输出矩阵
output=zeros(75,3);
for i =1:75
output(i,label_train(i))=1;
end
% ③构造2层神经网络,各节点为10,3
net1=newff(minmax(input),[10 3],{'tansig','tansig'},'traingd');
% ④配置参数
net1.trainparam.show = 50 ; % 显示中间结果的周期
net1.trainparam.epochs = 500 ; % 最大迭代次数(学习次数)
net1.trainparam.goal = 0.01; % 神经网络训练的目标误差
net1.trainParam.lr = 0.01 ; % 学习速率
% ⑤训练网络
net1=train(net1,input,output');
%% 开始测试
% ①测试集归一化
[test_input,minl,maxl]=premnmx(pattern_test');
% ②仿真
Y1=sim(net1,test_input);
% ③统计正确率
[s1,s2]=size(Y1);
count=0; % 判断正确的数目
for i=1:s2
[m,index]=max(Y1(:,i)); % m返回的是Y矩阵第i列中最大的数(归为类)
if(index==label_test(i,:)) % 计算得出的label与原label比较
count=count+1; % 判断正确则count+1
end
end
sprintf('识别率是 %3.3f%%',100 * count/s2) % 输出识别率
%%**********************更改网络层数及结点数***********************
% 2层,结点数分别为5和5
net=newff(minmax(train_X),[5,5],{'tansig','tansig'},'traingdx');
% 3层,结点数分别为10、10和3
net3=newff(minmax(input),[10 10 3],{'tansig','tansig','tansig'},'traingd');