一个简单的BP神经网络matlab程序(附函数详解)

2023-10-27

说明:20180604更新

1、此文的程序来自博客:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html

2、本人对其中涉及到的函数进行了详细说明。

3、此程序中部分函数的使用方式是高版本Matlab中不推荐的

文中给出了当前高版本Matlab中的使用方式,并给出了相关博客地址,具体如下:

归一化方式mapminmax :   http://blog.csdn.net/lkj345/article/details/50352385

newff函数的使用: http://www.cnblogs.com/xxfcz/p/4482813.html

4、使用过程中,可能出现的问题

https://blog.csdn.net/ckzhb/article/details/78615712

5、所需的IRIS数据集

https://download.csdn.net/download/ckzhb/10458430

https://github.com/xiaoxiaoxiaohui/Resource/tree/master/水仙花数据集

 

具体程序如下:

%读取训练数据
[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' ) ; 

%设置训练参数
net.trainparam.show = 50 ;
net.trainparam.epochs = 500 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;

%开始训练
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 ) ;

%仿真
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 )

 

 

详细说明:

 

1、文本文件读取函数

 

textread() 读取文件中数据,%f表示读取单浮点数,按列依次将数据存入f1、f2、f3……。这里f1—f4代表四个特征,class代表每组数据所属的类别。

这里的每列是一个属性/特征的所有输入值,并不是后面函数中输入的一组样本数据。

而在程序中 premnmxnewfftraintramnmx都是以列的形式输入每组样本数据,故在归一化时需要转置

 

2、归一化处理函数

premnmx()将原始数据归一化到-1到1之间,该函数在高版本的MATLAB中已被废弃。

[input,minI,maxI] = premnmx(P)

premnmx()对归一化,故需要将textread读取的原始数据进行转置,此时矩阵P是4行75列的(4个属性,75组训练样本)。

minI,maxI均是4行1列,这两个是为了后面的测试数据的归一化。

input是归一化后的矩阵475列。后面神经网络创建的newff函数的第一个参数是一个Rx2的矩阵以定义R个输入向量(即输入层节点个数-输入特征值个数)的最小值和最大值。

推荐使用mapminmax进行归一化:该函数也是对行归一化!!!

http://blog.csdn.net/lkj345/article/details/50352385

https://blog.csdn.net/ckzhb/article/details/72871140

例子:[inputn,setting]=mapminmax(input_train);

 

3、输出矩阵

%构造输出矩阵
s = length( class ) ;
output = zeros( s , 3  ) ; %zeros(s,3)生成s乘3的全零阵。即75行3列     
for i = 1 : s
   output( i , class( i )  ) = 1 ;
end

output是75行3列。class矩阵是75行1列,前几列是1,中间是2,最后是3.(即三种花的类型)。数据集中第一种花标记为1,第二种花记为2,第三种花记为3,这样经过循环后,output依然是75行3列,第一列的前几行全为1,第二列的中间几行全为1,第三列的最后几行全为1,其余均为0.

目的是:神经网络输出需要根据类别数量进行一定的处理,有几种类别输出层便含有几个结点,即第一种花输出为[1 0 0],第二种花输出为[0 1 0],第三种花输出为[0 0 1]。这里output每一行对应一组样本的输出类别,通过一个for循环,将所述的类所在的列置为1,此时output是75行3列的。后续train()函数所需的输出标签要求每一列对应一组数据的类别,故后续需要将output转置

 

4、神经网络构建

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

(此例是老版本的使用http://blog.sina.com.cn/s/blog_64b046c70101cko4.html)

旧版newff函数的格式为:

net=newff(PR,[S1S2 ...SN],{TF1 TF2...TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:

PRRx2矩阵以定义R个输入向量的最小值和最大值;

Si:第i层神经元个数;

TFi:第i层的传递函数,默认函数为tansig函数;

BTF:训练函数,默认函数为trainlm函数;

traingdx表示学习率自适应并附加动量因子的最速下降法

BLF权值/阈值学习函数,默认函数为learngdm函数;

PF:性能函数,默认函数为mse函数。

minmax()函数用于获取数组中每一行的最小值和最大值

新版newff函数格式:

 net =newff(P,T,[S1 S2...S(N-l)],{TF1 TF2...TFNl}, BTF,BLF,PF,IPF,OPF,DDF)

例如:net=newff(inputn,output_train,6,{'tansig','purelin'},'traingda');

P和T:输入和输出矩阵;每一列代表一组样本数据。

Si:第i层神经元个数,输出层不用写,根据T决定

TFi:第i层的传递函数,隐含层默认函数为tansig函数,输出层默认为’purelin’

BTF:训练函数,默认函数为trainlm函数,表示采用LM法进行训练;

BLF权值/阈值学习函数,默认函数为learngdm函数;

PF:性能函数,默认函数为mse函数即均方误差。

IPF:指定输入数据归一化函数的细胞数组。

OPF:指定输出数据反归一化函数的细胞数组

DDF:数据划分函数。

(后5个一般用不到)

 

 旧版本:旧用法训练次数多,但精度高  

新版本:新用法训练次数少,但精度可能达不到要求

造成上述原因是:

程序里面的权值、阈值的初始值是随机赋值的,所以每次运行的结果都会不一样,有好有坏。
你可以把预测效果不错的网络的权值和阈值作为初始值。
具体可以查看net.iw{1,1}net.lw{2,1}net.b{1,1}net.b{2,1}的值。

 

5、训练函数

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

这里input是4行75列,output经转置后是3行75列。

即每组数据是以列的形式输入到构建的神经网络模型,共75组。相应的,输出层与之对应,组数保持一致。

 

6、测试

Y = sim( net, testInput )

sim仿真,Y是训练好的网络net对输入testInput的实际输出。

若使用mapminmax()函数,测试数据归一化方法为:inputn_test=mapminmax('apply',input_test,setting);
 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个简单的BP神经网络matlab程序(附函数详解) 的相关文章

  • Matlab 中的 3D 堆叠条形图

    我想在一个图中绘制多个堆叠条形图 detached 条形图 例如 准确地想象一下bar http mathworks com help matlab ref bar3 detached png绘图 但堆叠在一起 而不是单一颜色 Set up
  • GO TO 语句 - Fortran 到 Matlab

    我一直在努力将此网格搜索代码从 Fortran 转换为 Matlab 但是我无法正确合并 GO TO 语句 我正在尝试使用 while 循环 但我认为我需要其他东西来结束搜索 任何帮助将不胜感激 vmax 1 0E 15 amax G 1
  • 使用网络计算机进行 Matlab 并行处理

    我熟悉matlabpool and parfor用法 但我仍然需要加快计算速度 我的 1GB 网络中有一台功能更强大的计算机 两台计算机都有 R2010b 并且具有相同的代码和路径 使用两台计算机进行并行计算的最简单方法是什么 我今天使用的
  • Matlab:如何读取以逗号作为小数分隔符的数字?

    我有很多 数十万 相当大 gt 0 5MB 的文件 其中数据是数字 但以逗号作为小数分隔符 使用像这样的外部工具对我来说是不切实际的sed s g 当分隔符是点时 我只使用textscan fid f f f 但我看不到更改小数点分隔符的选
  • 在 numpy/scipy 中查找 matlab 函数

    是否有一个等价的函数find A gt 9 1 来自 numpy scipy 的 matlab 我知道有nonzeronumpy 中的函数 但我需要的是第一个索引 以便我可以在另一个提取的列中使用第一个索引 Ex A 1 2 3 9 6 4
  • matlab中简单正弦波的傅里叶变换

    我尝试显示简单正弦波的频谱 因为我们知道具有固定频率的单个正弦波必须在其频谱中出现峰值我编写了这段代码 但我无法得到这个峰值我的代码中有什么问题 clc nsteps 200 number of signal elements in tim
  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • 计算数组中接下来的 n 个元素的乘积

    我想计算下一个的乘积n矩阵的相邻元素 号码n要相乘的元素数应在函数的输入中给出 例如 对于此输入 我应该从第一个开始计算每 3 个连续元素的乘积 p ind max product 1 2 2 1 3 1 3 这给出了 1 2 2 2 2
  • Matlab中转换数据类型的有效方法(double vs. im2double)

    我想将真彩色图像转换为双精度 据我所知有两种方法可以做到这一点 double rgb img im2double rgb img 哪一种效率更高 谢谢 他们都是不同的 im2double将图像的范围转换为0 1如果数据类型是uint8 or
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • MATLAB 中的多个捕获组

    我有一个包含数字或字母的字符串a 可能紧随其后的是r or l 在 MATLAB 中 以下正则表达式返回为 gt gt regexp 10r 0 9 a l r match ans 10r 我希望10 and r分开 因为我有两个捕获组 有
  • MATLAB - 如何将子图一起缩放?

    我在一张图中有多个子图 每个图的 X 轴是相同的变量 时间 每个图上的 Y 轴都不同 无论是它所代表的内容还是数据的大小 我想要一种同时放大所有图的时间尺度的方法 理想情况下 可以在其中一张图上使用矩形缩放工具 并让其他图相应地更改其 X

随机推荐

  • 【王道考研 操作系统】【第二章】处理机调度 进程调度算法

    目录 第二章 6 处理机调度的概念 层次 6 1 概念 6 2 调度的三个层次 6 2 1 高级调度 作业调度 6 2 2 中级调度 内存调度 6 2 3 低级调度 进程调度 6 2 4 三层调度的联系 对比 7 进程调度的时机 切换与过程
  • 安装教程--010Editor

    安装步骤 点击Next 选择第一个 再点击Next 选择安装的路径 再点击Next 全部选上 点击Next 点击Install开始安装 安装结束后 点击Finish关闭窗口 打开010Editor后 再右下角有这样的信息 表示我们只能使用3
  • 【Multisim仿真】运放电路:反相比例运算电路

    Multisim仿真 运放电路 反相比例运算电路 相关内容 Proteus仿真 集成运算放大器搭建以及基本功能电路 Multisim仿真演示 示波器设置 双击示波器图标 调节X轴扫描为500 S Di或1ms DIV A通道幅度为10mV
  • 如何使用CSS来修改元素的样式

    使用CSS来修改元素的样式 第一种方式 内联样式 行内样式 在标签内部通过style属性来设置元素的样式 问题 使用内联样式 样式只能对一个标签生效 如果希望影响到多个元素 必须在每一个元素中都复制一遍 并且当样式发生变化时 我们必须要一个
  • Git版本管理工具轻松入门

    git学习网址 GIT版本管理工具轻松入门 学习视频教程 腾讯课堂 1 版本控制软件 版本控制软件提供完备的版本管理功能 用于存储 追踪和文件的修改历史 是软件开发者的必备工具 2 版本管理工具主要有两个作用 代码版本管理 多人协作开发 3
  • js上传文件到c 服务器,js上传文件到c服务器

    js上传文件到c服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ
  • 【C++】基础知识(上)

    一 C 关键字 以上就是c 的部分关键词 这是c 98版本的关键词 因为版本的原因 与c 11有所出入 我们在写代码的过程中就是将这些关键词组合到一起的过程 二 命名空间 在C C 中 变量 函数和后面要学到的类都是大量存在的 这些变量 函
  • 股票交易——单调队列优化DP

    题目描述 思路 蒟蒻还是太弱了 就想到半个方程就GG了 至于什么单调队列就更想不到了 f i j 表示第 i天有j 张股票的最大收益 那么有四种选择 不买股票 f i j max f i j f i 1 j 买 j 张股票 之前没有买 f
  • 【Java8 新特性 3,linux基础视频

    1 Supplier简介 supplier接口是JAVA8以后配合lambda表达式和函数式接口编程 FunctionInterface 以下简称FI 组合使用的一个接口 对外表现为双冒号 顺便说下 gt 符号对应的是Function接口中
  • LeCun领导下的Meta AI,押注自监督

    作者丨ELIZA STRICKLAND 来源丨机器之心 自监督学习真的是通往 AGI 的关键一步 Meta 的 AI 首席科学家 Yann LeCun 在谈到 此时此刻要采取的具体措施 时 也没有忘记远期的目标 他在一次采访时说 我们想要构
  • vue嵌套iframe传参 通信

    首先了解iframe 是什么 iframe是html元素 用于在网页中内嵌另一个网页 每个iframe里各自维护自己的全局window对象 接下来就是iframe之间的通讯的 一般会用于 父页面传递Token给子页面 1 父页面代码 HTM
  • 奇妙的旋转(1):四元数,欧拉角及方向余弦矩阵

    1 从二维到三维 旋转的复杂化 旋转是对应刚体的 刚体可以看作一个质点系 刚体中每两个质点之间相对距离不发生变化 质点的运动用一个线速度即可描述 当刚体内质点运动具有不同线速度时 刚体发生了转动 描述刚体整体运动的参数是角速度和角加速度 描
  • 一周 AIGC 丨白宫宣布首个 AI 监管计划,中国 AI 领域或面临美国全面投资禁令...

    世界经济论坛 WEF 最新发布的报告显示 未来几年 因人工智能 AI 和经济增长放缓等因素 全球就业形势将受到严重冲击 全球近四分之一的工作岗位将发生变化 其中一些将被淘汰 还有一些将被创造出来 值得注意的是 到 2027 年 全球将新增
  • 自定义view的回调函数

    https www douban com note 456937471 onFinishInflate 当View中所有的子控件均被映射成xml后触发 onMeasure int int 确定所有子元素的大小 onLayout boolea
  • OLED透明屏拼缝技术:创新的显示解决方案

    引言 OLED透明屏作为一种创新的显示技术 已经在各个领域展现出了巨大的潜力 而其中的拼缝技术更是为OLED透明屏的应用带来了全新的可能性 对此 尼伽便大家具体介绍一下OLED透明屏拼缝技术的概念 优势以及应用领域 并探讨其在当前市场中的发
  • 2023初级Java工程师面试题及答案

    2023初级Java工程师面试题及答案 一 选择题 1 下面哪种是正确的创建Map集合的方式 2 下面程序段运行结果是什么 3 Linux系统中关于进程与线程的描述错误的是 5 初始化一个C程序二维数组代码如 6 单向链表已经可以实现非连续
  • 软件构造笔记:Java枚举

    在软件构造中 适当使用枚举类型可以方便客户端的使用 文章目录 Java 枚举 enum 内部类中使用枚举 迭代枚举元素 在 switch 中使用枚举类 枚举类成员 Java 枚举 enum Java 枚举是一个特殊的类 一般表示一组常量 比
  • 全民日志组件 Apache Log4j2 爆发漏洞,赶紧加班修复

    Java学习路线配套文章 Java学习路线总结 搬砖工逆袭Java架构师 全网最强 基础推荐 Java基础教程系列 实战推荐 Spring Boot基础教程 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主
  • Redis 排行榜 相同分数根据时间优先排行

    1 需求 Redis 提供了按分数进行排序的有序集合 比如在游戏里面 比如战斗力排行 充值排行 用默认的Redis 实现就可以达到需求 但是 比如等级排行 大家都是30级 谁先到30级谁第一 Redis 默认实现是 相同分数的成员按字典顺序
  • 一个简单的BP神经网络matlab程序(附函数详解)

    说明 20180604更新 1 此文的程序来自博客 http www cnblogs com heaad archive 2011 03 07 1976443 html 2 本人对其中涉及到的函数进行了详细说明 3 此程序中部分函数的使用方