神经网络分类器Matlab实现代码

一、模式识别神经网络

在matlab命令窗口输入:nnstart 或 nprtool 就可以进入matlab神经网络GUI  

二、鸢尾花数据集iris示例

1.输入数据集,划分训练集、测试集

load fisheriris;
[m,n]=size(meas);
data=zeros(m,n+1);
data(:,1:n)=meas;
for i=1:m                             %将字符串类别标签用数值形式表示
    if strcmp(species{i},'setosa')      %strcmp('A','B')用于比较字符串,找出特定的字符串;类比find(a==b)用来找出特定数值
        data(i,n+1)=1;
    elseif strcmp(species{i},'versicolor')
        data(i,n+1)=2;
    elseif strcmp(species{i},'virginica')
        data(i,n+1)=3;
    end
end
%选择训练样本个数
num_train = 60;                 %共150个样本,60个训练集,90个测试集
%构造随机选择序列
choose = randperm(length(data));           %随机种子打乱数据样本的顺序
train_data = data(choose(1:num_train),:);  %随机选取60个样本
label_temp = train_data(:,end);            %提取训练数据的标签  train(:,end)提取最后一列;
label_train = zeros(length(train_data),3); %创建矩阵以储存向量形式的标签;
%把输出分类标签1,2,3 改为工具箱要求的格式 1=[1 0 0],2=[0 1 0],3=[0 0 1]
for i = 1:length(train_data)
    label_train(i,label_temp(i)) = 1; 
end
train_data = train_data(:,1:end-1)';       %提取数据集特征(剔除标签),并进行转置(转置也可以不必,后续GUI中转化为行形式即可)
label_train = label_train';                %将向量形式表示的标签进行转置(也而不必,理由同上)

test_data = data(choose(num_train+1:end),:);  %提取测试集数据
label_temp = test_data(:,end);                %提取测试集数据的标签
label_test = zeros(length(test_data),3);      %创建矩阵,准备存放向量形式的测试数据的标签
%把输出分类标签改为工具箱要求的格式
for i = 1:length(test_data)
    label_test(i,label_temp(i)) = 1; 
end
test_data = test_data(:,1:end-1)';            %提取测试数据的特征,并进行转置
label_test = label_test';                     %提取测试数据的标签,并进行转置

2. 三种方法进行模式识别神经网络搭建

2.1 手动编写m函数法

法1操作方法:手动编写m函数如下

%有三种方式
%法1.命令窗口输入nnstart,选择pattern recognition app,用matlab自带GUI进行网络设置(最简单)
%法2.完成法1后,自动生成代码,将创建网络的代码用m文件保存,下次要调用该网络可直接调用该m文件
%法3.编写如下代码
% Create a Pattern Recognition Network
hiddenLayerSize = 10;                         %隐藏层神经元个数设置为10
net = patternnet(hiddenLayerSize);            %创建模式识别神经网络patternnet
% 将训练集再按比例70:15:15分为训练集、验证集、测试集
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% Train the Network
[net,tr] = train(net,train_data,label_train); %tr为训练过程参数?
% Test the Network
predict = net(test_data);       %得到每个样本属于第一类、第二类、第三类的概率
[~,predict] = max(predict);     %选择概率最大的类别作为某一个测试样本的类别
%% show the result --testings
fig=figure;
gscatter(test_data(1,:),test_data(2,:),predict);
[~,label_test] = max(label_test);
accuracy = length(find(predict==label_test))/length(test_data);
title(['predict the testing data and the accuracy is :',num2str(accuracy)]);

法1结果:

神经网络分类器matlab代码 神经网络分类 matlab_Network

准确率:93.3%,分类效果不错。

2.2 GUI法

法2操作方法:

输入nnstart:四种形式的神经网络:拟合/分类/聚类/时间序列。分类选择nprtool

神经网络分类器matlab代码 神经网络分类 matlab_Matlab_02

输入nprtool:

神经网络分类器matlab代码 神经网络分类 matlab_转置_03

注意这里的samples是按行还是按列,如果选择错误则无法点击next

法2结果:训练集的混淆矩阵

神经网络分类器matlab代码 神经网络分类 matlab_Matlab_04

可以重点看训练集(分为0.7:0.15:0.15)中的测试集 (是否有必要将训练集也这么分?);

得到准确率为88.9%,较高,分类效果不错。

法2操作:加入测试集

神经网络分类器matlab代码 神经网络分类 matlab_转置_05

法2结果:测试集的混淆矩阵

神经网络分类器matlab代码 神经网络分类 matlab_Network_06

准确率为96.7%,分类效果很好。

2.3 自动生成代码法

法3操作方法:由法1GUI得到的网络自动生成m代码如下,之后可直接调用该m文件,不需要用GUI。

操作如下:

神经网络分类器matlab代码 神经网络分类 matlab_神经网络分类器matlab代码_07

点击Simple Scrip即可自动生成代码

代码如下:

% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by Neural Pattern Recognition app
% Created 21-May-2020 20:32:42
%
% This script assumes these variables are defined:
%
%   train_data - input data.
%   label_train - target data.

x = train_data;
t = label_train;

% Choose a Training Function
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest.
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. Suitable in low memory situations.
trainFcn = 'trainscg';  % Scaled conjugate gradient backpropagation.

% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,x,t);

% Test the Network
y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
tind = vec2ind(t);
yind = vec2ind(y);
percentErrors = sum(tind ~= yind)/numel(tind);

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, ploterrhist(e)
%figure, plotconfusion(t,y)
%figure, plotroc(t,y)


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空