利用神经网络对鸢尾花数据集分类

利用神经网络对鸢尾花数据集分类

详细实现代码请见:https://download.csdn.net/download/weixin_43521269/12578696
一.简介
一个人工神经元网络是由一个多层神经元结构组成,每一层神经元拥有输入(它的输入是前一层神经元的输出)和输出,我们把神经元和与之对应的神经元之间的连线用生物学的名称,叫做突触,在数学模型中每个突触有一个加权数值,称做权重,此时第i层上的某个神经元所得到的输出等于每一个权重乘以第i-1层上对应的神经元的输出之和,最后再通过激活函数来对输出进行量化,在与阈值相比较判断是否属于某一类。
本文主要对BP神经网络进行一些粗浅的研究,对神经网络的原理进行了解后,尝试编写基于matlab的BP神经网络代码,然后进行实验。主要采取matlab中自带的数据集:鸢尾花数据集,有三个类别且每个类别具有4个属性,采用K-fold(交叉验证)对数据集进行划分,获取训练数据和测试数据,使用训练集进行训练,得出感知器输出方程的各个权重,接下来对测试集进行测试,最终与原标签进行比较,计算准确率。再调用matlab中的神经网络包对测试集进行测试,得出结果与编写的进行比较。

二.问题描述与数据描述
(一)问题描述
通过本实验加深对神经网络的理解,实现使用BP神经网络对鸢尾花数据集进行分类。

(二)数据描述
matlab中有自带的鸢尾花数据集,且都是已经处理好成mat格式,故只要直接导入便可。它是很常用的一个数据集,鸢尾花有三个分类,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。而且只有四个属性,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。总共150条数据。
三.如何解决问题
(一)模型假设
将鸢尾花的属性以坐标形式表示,建立以下支持BP神经网络模型:
在这里插入图片描述

1.如图所示,该神经网络一共有三层,输入层、隐藏层与输出层,输入的样本为x1、x2……xd(d=150),输出的向量为y1 y2……yl(l=3),隐藏层神经元数目为q。
2.其中输出层第j个神经元的阈值用θj表示,隐层第h个神经元的阙值用γh表示,输入层第i个神经元与隐层第h个神经元之间的连接权为vih,隐层第h个神经元与输出层第j个神经元之间的连接权为whj,bh为隐藏层第h个神经元的输出。选择sigmoid函数为激活函数。记隐层第h个神经元接收到的输入与输出层第j个神经元接收到的输入分别为:
在这里插入图片描述
在这里插入图片描述
3.对训练样本(xk,yk),神经网络的输出和均方误差分别为:
在这里插入图片描述
在这里插入图片描述

4.上面的神经网络中有(d+1+1)q+l个参数需确定:输入层到隐层的d×q个权值、隐层到输出层的q×l个权值、q个隐层神经元的阈值、l个输出层神经元的阈值.BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,任意参数v的更新估计式为
公式5
使用梯度下降法,以目标的负梯度方向对参数进行调整。对Ek,给定学习率η,有
公式6
注意到whj先影响到第j个输出层神经元的输出值βj,再影响到最终输出值,最后影响到Ek,所以有
公式7
由βj的定义有

公式8
Sigmoid函数的一个性质有
公式9
由公式1、2得
公式10
再将公式8、10带入公式7,再代入公式6得到whj的更新公式
公式11
同样可以得到
公式12
公式13
公式14
其中eh为
在这里插入图片描述
在这里插入图片描述
5.总结
BP算法的工作流程:对每个训练样例,BP算法执行以下操作:
(1)先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;
(2)然后计算输出层的误差(第4-5行),
(3)再将误差逆向传播至隐层神经元(第6行),
(4)最后根据隐层神经元的误差来对连接权和阈值进行调整(第7行该迭代过程循环进行,直到达到某些停止条件为止。

在这里插入图片描述
(二)实现代码步骤
1.导入数据集
鸢尾花数据集在matlab中为fisheriris,故使用load fisheriris即可。
2.数据预处理
(1)转化标签
matlab自带的鸢尾花数据集的标签为setosa、versicolo和virginica,在建立神经网络的时候,要将其转化为一个3维的向量。如山鸢尾的标签为[1 0 0]、变色鸢尾的标签为[0 1 0]和维吉尼亚鸢尾的标签为[0 0 1]。
(2)数据归一化
将数据集的所有数据都归一化到[0,1]区间,以便提高模型的收敛速度与精度。
(3)划分训练集与测试集
交叉验证来选取训练集与测试集,将原始数据分成5组(K-Fold),将每个子集数据分别做一次验证集,其余的4组子集数据作为训练集,这样会得到5个模型。这5个模型分别在验证集中评估结果,最后的结果加和平均就得到最终结果。交叉验证有效利用了有限的数据,使得评估结果能够尽可能接近模型在测试集上的表现。流程如下:
在这里插入图片描述

本实验将数据集分为五组,每次选取四组为训练集,其他一组为测试集。对鸢尾花数据集进行五次训练,最终将得到五个结果,选取其平均值为最终结果。
(4)建立BP神经网络
根据模型假设中的算法设计编写参数更新代码(使用递归),对训练集进行训练,得出最终的神经网络模型。
(5)测试准确率
对得到的模型进行检验,使用测试集进行仿真训练。
(6)调整模型
进行多次实验,对模型进行微调,如隐藏神经元数目、迭代最大次数、学习率。
(7)与内置包进行比较
调用神经网络包对数据进行训练测试,得出准确率,并进行比较。

四.数值实验
(一)分析结果
1.编程实现神经网络结果
第一次训练的准确率为:96.67%
第二次训练的准确率为:100%
第三次训练的准确率为:100%
第四次训练的准确率为:96.67%
第五次训练的准确率为:90%
平均准确率为:96.67%
2.调用神经网络包结果
第一次训练的准确率为:100%
第二次训练的准确率为:100%
第三次训练的准确率为:93.33%
第四次训练的准确率为:96.67%
第五次训练的准确率为:93.33%
平均准确率为:96.67%

五.总结
由于使用k-折交叉运算的方法进行多次实验,所以以最终平均准确率为标准,自定义BP神经网络的结果与调包使用的结果一致,都为96.67%,而从每一次的训练结果上看,也都保持在90%以上,都能够实现较好的分类。

六.参考文献与网站
[1]机器学习导论
[2]机器学习_周志华
[3]K-Fold 交叉验证 (Cross-Validation)的理解与应用:https://www.cnblogs.com/xiaosongshine/p/10557891.html
[4]matlab 中“newff” 函数的参数设置:
https://blog.csdn.net/weixin_30681121/article/details/99843850
[5]利用BP神经网络分类iris数据集:
https://blog.csdn.net/lovefreewind/article/details/42679243
[6] matlab详解newff(前馈反向传播网络):
https://blog.csdn.net/xiaotao_1/article/details/79078729
[7] matlab神经网络不常见问题:
https://blog.csdn.net/weixin_42296976/article/details/81252809
[8] 支持向量机与神经网络的区别:
https://download.csdn.net/download/chyzh2012/4791564

  • 8
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值