zoukankan      html  css  js  c++  java
  • matlab神经网络多分类(模式识别神经网络nprtool)

    一、模式识别神经网络

    在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结果:

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

    2.2 GUI法

    法2操作方法:

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

    输入nprtool:

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

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

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

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

    法2操作:加入测试集

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

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

    2.3 自动生成代码法

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

    操作如下:

    点击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)

    参考资料:

    1.监督算法之BP,SVM,adaboost的非线性多分类实验,https://blog.csdn.net/on2way/article/details/48006539,作者:on2way

    2.matlab神经网络工具箱:https://blog.csdn.net/on2way/article/details/47428201

    3.adaboost分类:https://www.cnblogs.com/litthorse/p/9332370.html

  • 相关阅读:
    设计模式之设计原则
    浅谈简单工厂模式和策略模式
    Flask-SQLAlchemy插件
    SQLAlchemy的ORM
    Flask 微博三方登录
    SQLAlchemy介绍和基本使用
    Flask常用的钩子函数
    Flask-Restful详解
    flask信号使用
    多线程爬取斗图图片
  • 原文地址:https://www.cnblogs.com/feynmania/p/12933575.html
Copyright © 2011-2022 走看看