首页
学习
活动
专区
工具
TVP
发布

ANN神经网络入门-分类问题

---------------写-在-前-面---------------本篇推文的水仙花分类程序参考自博客http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html

在上述博客中,作者主要介绍了以下三部分内容:

(1)神经网络基本原理

(2)AForge.NET实现前向神经网络的方法

(3)Matlab实现前向神经网络的方法

本博客主要给出神经网络算法的两个简单应用,分别为:

Fishr集上鸢尾花(Iris)的分类

常见的分类问题-蠓虫分类

同时通过对两个分类程序(Code by MATLAB)进一步分析,加强对神经网络算法的理解。

---------------我是一条分割线----------------

本文用到的所有程序和源文件下载请见以下链接:https://pan.baidu.com/s/1ggYS3gn 密码:tepb

转载或引用请注明来源

--------------------------------------------------

正文

1、Fishr集上鸢尾花Iris数据集的分类iris数据集简介

iris数据集的中文名是安德森鸢尾花卉数据集,英文全称是Anderson’s Iris data set。iris包含150个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,所以iris数据集是一个150行5列的二维表。

通俗地说,iris数据集是用来给花做分类的数据集,每个样本包含了花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征(前4列),我们需要建立一个分类器,分类器可以通过样本的四个特征来判断样本属于山鸢尾、变色鸢尾还是维吉尼亚鸢尾(这三个名词都是花的品种)。

iris的每个样本都包含了品种信息,即目标属性(第5列,也叫target或label)。

样本局部截图:

MATLAB中可运行命令load iris.dat将数据集载入到工作区,部分数据集如图所示。数据集的前四列分别为与鸢尾花种类相关的4个特征值,对应上图中的花萼长度、花萼宽度、花瓣长度及花瓣宽度;第五列为鸢尾花所属种类,分为1-Setosa、2-Versicolour、3-Virginica三类。

数据预处理

这里的神经网络属于监督学习的模式,因此需要从上述数据集中分离出训练集和测试集,我们分别记为trainData和testData。我们从iris数据集中选取2/3数据作为训练集trainData,选取1/3数据作为测试集testData,并分别将其保存至trainData.txt和testData.txt文件,用于程序的数据导入源(两个文件均已上传至源代码)。

分类源程序

[MATLAB]

%读取训练数据

clear

clc

load iris.dat;

%f1 f2 f3 f4是四个特征值

[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);

%特征值归一化

[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ;

%构造输出矩阵

s = length( class) ;

output = zeros( s , 3 ) ;

for i = 1 : s

output( i , class( i ) ) = 1 ;

end

%创建神经网络

net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ;

%{

minmax(input):获取4个输入信号(存储在f1 f2 f3 f4中)的最大值和最小值;

[10,3]:表示使用2层网络,第一层网络节点数为10,第二层网络节点数为3;

{ 'logsig' 'purelin' }:

表示每一层相应神经元的激活函数;

即:第一层神经元的激活函数为logsig(线性函数),第二层为purelin(对数S形转移函数)

'traingdx':表示学习规则采用的学习方法为traingdx(梯度下降自适应学习率训练函数)

%}

%设置训练參数

net.trainParam.lr = 0.01 ;%学习速率(Learning rate)

%开始训练

%其中input为训练集的输入信号,对应output为训练集的输出结果

net = train( net, input , output' ) ;

%===训练完成===%

%==接下来进行测试====%

%读取测试数据

[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);

%测试数据归一化

testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;

%[testInput,minI,maxI] = premnmx( [t1 , t2 , t3 , t4 ]') ;

%仿真

%其中net为训练后得到的网络,返回的Y为

Y = sim( net , testInput )

%统计识别正确率

[s1 , s2] = size( Y ) ;

hitNum = 0 ;

for i = 1 : s2

[m , Index] = max( Y( : , i ) ) ;

if( Index == c(i) )

hitNum = hitNum + 1 ;

end

end

sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )

代码的相关说明

A.语句net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ;用于创建神经网络,其参数含义和用法如下:

(1)minmax(input):获取4个输入信号(存储在f1 f2 f3 f4中)的最大值和最小值;

(2) [10,3]:表示使用2层网络,第一层网络节点数为10,第二层网络节点数为3。其中最后一层的网络包含的节点数一定要与网络的理论输出个数保持一致,例如本例中鸢尾花的种类数为3,因此最后一层的网络节点数为3;

(3){ 'logsig' 'purelin' }:表示每一层相应神经元的激活函数,即:第一层神经元的激活函数为logsig(线性函数),第二层为purelin(对数S形转移函数),其他激活函数和用法请参见神经网络与深度学习之激活函数;

(4) 'traingdx':表示学习规则采用的学习方法为traingdx(梯度下降自适应学习率训练函数)。常见的训练函数(学习方法)有:

traingd :梯度下降BP训练函数(Gradient descent backpropagation)

traingdx :梯度下降自适应学习率训练函数

(5)创建的神经网络用MATLAB神经网络工具箱显示如图,图中更形象的展示了构造的神经网络模型。

B.关于正确率的统计算法的说明

第一次看到这里的正确率统计算法时,我自己是不大明白的,之后又从网上搜了一些资料并查阅了MATLAB的帮助文档,才明白代码的含义。

语句net = train( net, input , output' ) ;是对网络进行训练,该语句明确了网络的输出为output,通过对output矩阵的构造方式分析,我们可知网络的输出可以看成3个,我们不妨即为C1、C2、C3,分别代表鸢尾花的三个种类,例如:

(1)当output的某一行为1 0 0,则说明该花属于C1类

(2)当output的某一行为0 1 0,则说明该花属于C2类

(3)当output的某一行为0 1 0,则说明该花属于C3类

语句Y = sim( net , testInput )是对训练后的网络net进行仿真测试,测试用的数据为testInput;这里,Y返回的是网络训练后对测试输入的预测值,例如:

(1)当Y的某一行为1.0220 -0.0020 -0.0091,代表输出结果C1=1.0220, 输出结果C2=-0.0020,C3=-0.0091

(2)当Y的某一行为-0.0108 0.9884 -0.0216,代表输出结果C1=-0.0108,输出结果C2=0.9884,C3=-0.0216

输出结果中只包含一个1和两个0是理想情况下的结果,在进行仿真时,分类输出往往达不到这样的结果,但我们可以根据哪个结果对应的值与1的接近程度来进行判断,例如:

仿真结果(1)说明该花极有可能属于C1类,

仿真结果(2)说明该花极有可能属于C2类。

*从以上描述中我们可以明白神经网络算法也可以应用于具体数值的预测,且应用广泛。

仿真和运行结果

说明:以上程序的识别率稳定在96%左右,训练150次左右达到收敛,训练曲线如上图所示:

2、蠓虫分类背景介绍

生物学家WLGrogan和WWWirth发现,蠓虫的种类与它们的触角长度和翼长有关,且蠓虫大致分为两类,记为Apf和Af。

现有如下样本,下面需要通过神经网络模型找到一种有效的对蠓虫分类的方法。

数据预处理与鸢尾花分类类似,我们随机选取2/3作为训练集trainData,1/3作为测试集testData,考虑到这是一个分类问题,因此我们将目标值0.9替换为2,代表蠓虫属于Apf类;将目标值0.1替换为1,代表蠓虫属于Af类,处理后导入至文本文件trainData.txt和testData.txt,作为程序的数据导入源文件(两个文件均已上传至源代码)。

分类源程序

[MATLAB]

%读取训练数据

clear

clc

%f1 f2 f3 f4是四个特征值

[f1,f2,class] = textread('trainData.txt' , '%f%f%f');

%特征值归一化

[input,minI,maxI] = premnmx( [f1 , f2 ]') ;

%构造输出矩阵

s = length( class) ;

output = zeros( s , 2 ) ;

for i = 1 : s

output( i , class( i ) ) = 1 ;

end

output

%创建神经网络

net = newff( minmax(input) , [10 2] , { 'logsig' 'purelin' } , 'traingdx' ) ;

%设置训练參数

net.trainParam.lr = 0.01 ;%学习速率(Learning rate)

%开始训练

%其中input为训练集的输入信号,对应output为训练集的输出结果

net = train( net, input , output' ) ;

%==训练完成==%

%==接下来进行测试=%

%读取测试数据

[t1 t2 c] = textread('testData.txt' , '%f%f%f');

%测试数据归一化

testInput = tramnmx ( [t1,t2]' , minI, maxI ) ;

%[testInput,minI,maxI] = premnmx( [t1 , t2]') ;

%仿真

%其中net为训练后得到的网络,返回的Y为

Y = sim( net , testInput )

%{

Y返回预测值,输出有两个记为A、B,理想情况下输出为上述的output,输出结果只有1和0两种

即:output =

0 1

0 1

0 1

0 1

1 0

1 0

1 0

1 0

1 0

1 0

-------------------

例:Y =

0.1432 0.4841 1.0754 1.2807 0.8405

0.6034 0.5329 0.1427 -0.4194 0.0947

则说明:

对于第一个测试数据,输出结果A=0.1432,输出结果B=0.6034

对于第一个测试数据,输出结果A=0.4841,输出结果B=0.5329

因此,对于本例:若结果A更接近于1(左接近或右接近),那么说明该测试数据属于第一个分类;

若结果B更接近于1(左接近或右接近),那么说明该测试数据属于第二个分类。

因此,ANN除了应用于分类问题,也可应用于对具体数值的预测问题。

__2018.02.06 by_LeoHao

%}

%统计识别正确率

[s1 , s2] = size( Y ) ;

hitNum = 0 ;

for i = 1 : s2

[m , Index] = max( Y( : , i ) ) ;

if( Index == c(i) )

hitNum = hitNum + 1 ;

end

end

sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )

神经网络可视化

创建的神经网络用MATLAB神经网络工具箱显示如图,图中更形象的展示了构造的神经网络模型。

仿真和运行结果

说明:从上图来看,识别率近似于100%,训练在120次左右仅稍微达到收敛,这可能是由于训练集样本规模太小导致的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206G1CRGM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券