机器学习之实战matlab神经网络工具箱

2023-11-06

上节在
《机器学习之从logistic到神经网络算法》
中,我们已经从原理上介绍了神经网络算法的来源与构造,并编程实战了简单神经网络对于线性与非线性数据的分类测试实验。看过上节的可能会发现,上节实现的算法对于非线性数据的分类效果并不是非常完美,有许多值得优化的地方。而matlab作为一个科学计算软件,本身集成了非常多的优化算法,其中的神经网络工具箱就是其中一个优秀的工具箱,本节将以工具箱中的函数重新实验上节中的分类实验。

首先来了解这个工具箱。我们说,一个简单的神经网络就如下图所示:
这里写图片描述
这是我们上节用过的网络,含有两层,每层3个节点的网络。然而已经证明,其实只含有一个隐含层的网络是可以拟合出任意有限的输入输出映射问题的。基于此,在matlab集成的工具箱中我们只能看到只含有一个隐含层的网络,而网络的节点个数却是我们可以需要改变与设计的。简单来工具箱的一个简单神经网络可以表示如下:
这里写图片描述
通过输入然后映射到输出,输出在映射到最终输出。整个网络包含权值w、v和常数b。网络需要设计的就是确定隐含层的节点个数(matlab默认10),同时映射函数需要注意,上节我们默认的都是采用sigmod函数,然而matlab默认的是隐含层输出采用sigmod,而输出后的映射采用的是线性映射,像上图中的在输出部分的红色所示。其实除了这两种映射函数外,还有正切等等函数,可以作为映射函数的共同点就是他们都是可导的(这是原理推导上所必须的)。那么matlab默认输出映射为什么是线性的而不是sigmod的呢?我们知道sigmod函数会把数据映射到0-1之间,然而我们实际应用中获得的数据的目标值(分类标签)并不一定都在0-1之间,那么如果用sigmod函数,那么我们需要把原始数据的目标输出转化到0-1之间,而线性映射就没有这个问题(因为它映射后的数据没有上下限)。

好了下面说说关于几个重要的函数:

  1. 网络创建函数:feedforwardnet(hiddenSizes,trainFcn) ,(matlab2012后较新的版本),在老版本的matlab,这个函数是newff。这个函数就是创建一个上述的(前馈)网络,包括两个参数,第一个hiddenSizes隐藏层的大小(实际就是节点数的多少,默认10),trainFcn是网络训练所采取的方法,这个方法包括:梯度下降算法、动量梯度下降算法、变学习率梯度下降算法等等数10种方法,各种方法各有优缺点,而有代表性的方法是有代表性的五种算法为:’traingdx’,’trainrp’,’trainscg’,’trainoss’,’trainlm’,默认的是’trainlm’。其实不需要了解的太详细,一般的数据默认的方法就非常的好了,所以这个参数可以不用管。给一个详细介绍这个函数的链接:

    matlab神经网络函数(feedforwardnet,fitnet,patternet)
    关于MATLAB神经网络命令feedforwardnet的一些记录

  2. 好了网络创建完以后,下面就是训练网络的参数了,这里的参数就是权值矩阵w,v,以及常数矩阵b。函数是train,关于这个函数其实可以有很多参数,也可以只有几个参数,因为好多参数都是有默认,而采用默认值就可以得到很好的效果,比如迭代次数,训练最小的允许误差等等。这里只说几个重要的参数,
    1.第一个参数,上述创建的网络net,
    2.第二个,训练数据,
    3.第三个,与训练数据对应的数据目标值(分类标签或者输出值等),这个输出值不光可以是一维的,还可以是多维的。

    部分详细参考如下:bp神经网络及matlab实现

而train函数出来的就是训练好的网络net,matlab出来的net是一个结构体数据,里面包括了网络的所有信息(训练方法,误差,包括我们熟悉的权值矩阵w,b等等),那么我们是否需要把w与b在提取出来呢?并不需要,在实际应用中,我们可以直接把需要测试的数据输入到net中就可以了。比如说现在网络训练好了就是net,那么来了一个测试样本sample,那么它的输出值就是net(sample),这样就可以达到预测的目的了。

好了,了解这些就可以实验了,还有许多详细的细节部分也可以改变,用不到的说多了可能也没有用就不说了。

下面同样实验上一节的两组人造样本集,线性集与非线性集,画出来如下:
这里写图片描述
这里写图片描述
代码如下:

%%  
% * matlab自带神经网络工具箱的分类设计
% * 线性与非线性分类
% 
%% 
clc
clear
close all
%% Load data
% * 数据预处理--分两类情况
data = load('data_test1.mat');
data = data.data';
% 将标签设置为0,1
data(:,3) = data(:,3) - 1;
%选择训练样本个数
num_train = 80;
%构造随机选择序列
choose = randperm(length(data));
train_data = data(choose(1:num_train),:);
gscatter(train_data(:,1),train_data(:,2),train_data(:,3));
label_train = train_data(:,end);
test_data = data(choose(num_train+1:end),:);
label_test = test_data(:,end);
%% 神经网络的构建与训练
% 构造神经网络(包含10个隐藏层的节点)
net = feedforwardnet(10);
% net.layers{2}.transferFcn = 'tansig';% 输出的映射方法,默认purelin--线性映射
% 训练网络
net = train(net,train_data(:,1:end-1)',label_train');
% 显示构造的网络
view(net);
% 用这个网络来预测测试集的分类
y_test = net(test_data(:,1:end-1)');
%输出的值四舍五入,认为大于0.5的属于类‘1’,其他的属于类‘0’
predict = round(abs(y_test));

%% 显示结果--测试训
figure;
index1 = find(predict==0);
data1 = (test_data(index1,:))';
plot(data1(1,:),data1(2,:),'or');
hold on
index2 = find(predict==1);
data2 = (test_data(index2,:))';
plot(data2(1,:),data2(2,:),'*');
hold on
indexw = find(predict'~=(label_test));
dataw = (test_data(indexw,:))';
plot(dataw(1,:),dataw(2,:),'+g','LineWidth',3);
accuracy = length(find(predict'==label_test))/length(test_data);
title(['predict the training data and the accuracy is :',num2str(accuracy)]);

首先加载线性数据集:
这里写图片描述
这里写图片描述

绿色为错分的点,程序中我们采用的是10个隐含层节点,同时输出采用的默认的映射—线性映射。程序中也有sigmod映射(对应的注释掉的地方)。

下面进行非线性数据的测试:
这里写图片描述
同样,绿色为错分的点。可以看到,准确率终于上升到80%以上(与上节对比,基本上不可能)。这里我们再把输出映射也改为sigmod映射,因为我们的输出标签已经改到了0、1标签,输入就在0-1之间,所以可以直接用。将上述对应的注释去掉,改完后的结果如下:
这里写图片描述
可以看到输出采用sigmod函数效果似乎更好些。同时再来看看画出来的网络结构:
这里写图片描述
看这个结果和上面那个结构,你发现了什么?是不是输出层的映射关系变化了。

这就是matlab下基本神经网络的训练与预测实验,其神经网络工具箱功能远远不止这。同时我这是采用函数命令实现的,matlab对于神经网络集成了GUI功能,可以直接在图形界面操作。在命令窗口输入:nnstart就会出现下面GUI界面:
这里写图片描述
可以看到matlab下神经网络主要有四个方向用途:拟合数据,模式识别与分类数据,聚类数据,时间序列模型的数据处理,可以看到,我们这篇的这个问题其实是输入模式分类数据这部分的,考虑篇幅有限,感兴趣自己可以去详细研究其他用途,异常的强大。

总结一下该部分,matlab自带神经网络工具箱相比上节自己编的,对于线性数据准确率大概差不多,但是对于非线性数据的划分,工具箱的函数效果优化的非常好,同时用法也简单,运算速度快,可以说是一个非常好的一个分类方法。

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

机器学习之实战matlab神经网络工具箱 的相关文章

  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • 基本矩阵错误?

    我试图通过扫描从相机拍摄的两个图像 检测图像中的特征 匹配它们 创建基本矩阵 使用相机内在函数计算基本矩阵 然后分解它以找到旋转和翻译 这是matlab代码 I1 rgb2gray imread 1 png I2 rgb2gray imre
  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • MATLAB 子图标题和轴标签

    我有以下脚本来最终绘制 4 x 2 子图 files getAllFiles preliminaries n size files cases cell 1 n m cell 1 n for i 1 1 n S load files i c
  • 将值从 C++ MEX 文件返回到 MATLAB

    我正在编写一个从 C 代码中检索数据的 MATLAB 程序 为此 我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction 虽然可以在 MATLAB 中读取读取值 但我无法检索它来使用它 如果不清楚 我有与这里完全相
  • 使用 scipy.io 将 python pandas dataframe 转换为 matlab 结构

    我正在尝试使用 scipy io 将 pandas 数据帧保存到 matlab mat 文件 我有以下内容 array1 np array 1 2 3 array2 np array a b c array3 np array 1 01 2
  • matlab中简单正弦波的傅里叶变换

    我尝试显示简单正弦波的频谱 因为我们知道具有固定频率的单个正弦波必须在其频谱中出现峰值我编写了这段代码 但我无法得到这个峰值我的代码中有什么问题 clc nsteps 200 number of signal elements in tim
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 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
  • 可以避免迭代元胞数组时的“s{1} 烦恼”吗?

    The s 1 标题的 烦恼 指的是下面的 for 块中的第一行 for s some cell array s s 1 unpeel the enclosing cell do stuff with s end This s s 1 业务
  • 当 MATLAB 变得非常非常忙时,如何中断它?

    我正在运行一个长时间的模拟MATLAB http en wikipedia org wiki MATLAB我意识到我需要停下来重新运行 然而 MATLAB 确实对这种计算很感兴趣 并且它停止了响应 如何在不终止 MATLAB 的情况下中断此
  • Python 中的 eig(a,b) 给出错误“需要 1 个位置参数,但给出了 2 个”

    根据https docs scipy org doc numpy 1 15 0 user numpy for matlab users html https docs scipy org doc numpy 1 15 0 user nump
  • 静态时序数据的数据库解决方案

    我们拥有一个庞大且不断增长的实验数据集 该数据集取自约 30 000 名受试者 对于每个主题 都有多个数据记录 在每个记录中 收集了多个生理数据时间序列 每个时间序列约 90 秒长 并以 250Hz 采样 我应该注意到 时间序列的任何给定实
  • MATLAB:MEX 矩阵除法给出的结果与 m 文件不同

    我使用 MATLAB 的编码器工具创建了矩阵指数函数的 MEX 版本 以在另一组函数中使用 问题是 MEX 版本给出的结果与原始 m 文件不同 经过调试 我认为这是因为MEX文件和m文件没有做相同的矩阵除法 或者 MEX 文件首先就有问题
  • 如何在 MATLAB 中为 4 个子图创建一个通用图例?

    如何在 MATLAB 中为 4 个子图创建一个通用图例 如下所示 又快又脏 hSub subplot 3 1 1 plot 1 1 1 1 1 1 1 1 hLegend legend hello i am legend subplot 3
  • Matlab 中的多行匿名函数? [复制]

    这个问题在这里已经有答案了 是否可以在 Matlab 中创建多行匿名函数 没有合适的例子在文档中 http www mathworks com help matlab matlab prog anonymous functions html
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即

随机推荐

  • Rust使用Actix-Web验证Auth Web微服务 - 完整教程第1部分

    Rust使用Actix Web验证Auth Web微服务 完整教程第1部分 文章出自Rust中文社区 我们将创建一个rust仅处理用户注册和身份验证的Web服务器 我将在逐步解释每个文件中的步骤 完整的项目代码在这里 事件的流程如下所示 使
  • linux中如何安装windows

    首先将windows镜像拷贝到根目录的ios下 这个文件可自行选择位置 我这里使用的是windows10 并且已经提前安装了虚拟机组件 然后用root用户的身份在命令行输入 virt manager 点击file下面的小电脑 然后选择刚刚拷
  • FBXSDK踩坑之——搭建环境

    1 创建一个C 控制台影用程序 2 C 常规设置里设置附加包含目录 3 设置连接器常规设置的附加库目录 4 连接器的输入设置里设置附加依赖项和忽略特定默认库 5 根据前面选择的附加依赖项来选择运行库 选择参考 注意 如果使用动态链接要设置预
  • Spring Boot集成持久化Quartz定时任务管理和界面展示

    前言 本文是对之前的一篇文章Spring SpringMVC mybatis Quartz整合代码部分做的一个修改和补充 其中最大的变化就是后台框架变成了Spring Boot 本工程所用到的技术或工具有 Spring Boot Mybat
  • Virtual DOM(虚拟 DOM)

    文章目录 什么是 Virtual DOM 为什么要使用 Virtual DOM 虚拟 DOM 的作用 虚拟 DOM 库 Snabbdom 基本使用 安装 parcel 配置 scripts 目录结构 导入 Snabbdom 基本使用 包含子
  • 一文看尽深度学习中的各种数据增强

    目录 引言 数据增强的定义 数据增强的作用 省钱 省时 省心 提升模型性能 数据增强的方式 基础数据增强方法 Image Manipulation Rotation Translation Shearing Flipping Croppin
  • unity 游戏开发过程中需要注意和后期优化的重点方向和难点分析(大白话理论篇)

    开发游戏也有近3年时间了 自己是做app移动开发出身 可能入手unity开发手机游戏 算是有点小优势 毕竟起码开始就有点unity它是怎么一步步转化为一个用户用的app 在用unity做游戏的时候 自己也尝试过使用cocos2d x 感觉下
  • 使用 Docker 搭建你自己的 RSS 服务(FreshRSS)

    本文使用 署名 4 0 国际 CC BY 4 0 许可协议 欢迎转载 或重新修改使用 但需要注明来源 署名 4 0 国际 CC BY 4 0 本文作者 苏洋 创建时间 2019年01月05日 统计字数 1983字 阅读时间 4分钟阅读 本文
  • sys.path.insert()用法

    注 sys path模块是动态的修改系统路径 模块要处于Python搜索路径中的目录里才能被导入 但我们不喜欢维护一个永久性的大目录 因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累 本节代码动态地在该路径中添加了一个
  • 循环动态渲染img标签

    img alt listInfo icon buKa png type 补卡 id 1 icon xiuJia png type 休假 id 2
  • VS工程的3个基本文件

    VS的工程根目录下有3个文件 这3个文件都可以用记事本打开 其中 1 MyTest sln 工程主文件 含属性设置 工程从该文件打开 工程的主要属性设置在该文件中 2 MyTest filters 工程目录结构筛选器 工程的目录结构保存在这
  • leetCode热题52-57 解题代码,调试代码和思路

    前言 本文属于特定的六道题目题解和调试代码 1 剑指 Offer 22 链表中倒数第k个节点 Easy 2022 09 01 91 2 76 最小覆盖子串 Hard 2023 03 27 82 3 165 比较版本号 Medium 2023
  • Me and My Girlfriend靶机渗透

    背景描述 这个VM告诉我们 有一对恋人 即Alice和Bob 这对夫妻本来很浪漫 但是自从Alice在一家私人公司 Ceban Corp 工作以来 爱丽丝对鲍勃的态度发生了一些变化是 隐藏的 而鲍勃 Bob 寻求您的帮助 以获取爱丽丝 Al
  • Python 第四章 字典:当索引不好用时

    字典 是Python中唯一内建的映射数据结构类型 这里的映射是指通过名字引用值 字典中的值并没有特殊的顺序 值都是存储在一个特定的键里 键可以是数字 字符串甚至是元祖 什么是键 什么是值 怎么映射呢 请继续看下去 创建和使用字典 下面来创建
  • ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

    运行 npm run serve 报以下错误 首先检查一下文件中是否有node modules文件夹 如果没有则执行以下代码 npm install 其中可能会有很多警告 不用搭理 如果文件中已经有node modules文件夹 那么先把n
  • 接口自动化测试总结

    前言 本文是我在公司总结的一点点个人建议 可能有非常多的遗漏 先记录下来这时候我的理解 公司是做共享单车业务的 所以场景基本上也可以复用 毕竟大家都骑过单车 注明 code是我司接口返回的标志 编写之前 接口相关 这块总结不全 了解接口的功
  • 【Springboot WebSocket STOMP使用 2】STOMP使用@SendToUser实现用户个人请求-响应

    背景 STOMP协议的模型是 订阅 发布 式的 所以一般场景是同一个主题的广播 而有些场景下用户既想保持当前的WebSocket Session复用 又想消息的响应只有我自己能收到 指定其他某一个用户也行 不过得用其他api方法 不需要别人
  • 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)

    九月十月百度人搜 阿里巴巴 腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今 事实上 上篇文章更新了近3个月之久 blog已经停了3个多月 而在那之前 自开博以来的21个月每月都不曾断过 正如上一篇文章支持向量机通俗导论 理解SV
  • 嵌入式Linux下使用OpenCV

    By Toradex 秦海 1 简介 OpenCV的全称是Open Source Computer Vision Library 是一个跨平台的计算机视觉库 OpenCV是由英特尔公司发起并参与开发 以BSD许可证授权发行 可以在商业和研究
  • 机器学习之实战matlab神经网络工具箱

    上节在 机器学习之从logistic到神经网络算法 中 我们已经从原理上介绍了神经网络算法的来源与构造 并编程实战了简单神经网络对于线性与非线性数据的分类测试实验 看过上节的可能会发现 上节实现的算法对于非线性数据的分类效果并不是非常完美