MATLAB神经网络编程(四)——线性神经网络的实现与局限

2023-11-01

**MATLAB神经网络编程》 化学工业出版社 读书笔记
第四章 前向型神经网络 4.2 线性神经网络**

本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书。


一,线性神经网络的实现。

线性神经网络在模式识别、信号滤波和预测、函数逼近等方面有广泛的用途,下面用实例来说明线性神经网络的MATLAB仿真程序设计。

1,线性神经网络在模式分类中的应用。
【例4-16】一单层线性神经网络模拟与函数。

根据与函数的性质,与函数是一个简单的线性划分问题,用一个线性神经元构成的网络就可以实现。基本结构:

  • 网络有一个输入向量,包括2个元素,输入元素的取值范围[0 1]
  • 输出有一个元素,为二值变量0或1
    设计的线性神经网络的结构示意图如下:

    16

源代码:

clear all;
%设计线性神经网络
p=[0 0;0 1;1 0;1 1]';   %输入向量
t=[0 0 0 1];       %输出向量
net=newlind(p,t)    %设计线性神经网络
w=net.iw{1}
b=net.b{1};
%线性神经网络的仿真
a=sim(net,p)     %输出仿真结果
y=a>0.5      %将模拟仿真结果转换为数字量

输出为:


w =

    0.5000    0.5000


b =

   -0.2500


a =

   -0.2500    0.2500    0.2500    0.7500


y =

     0     0     0     1

2,线性神经网络在噪声对消中的应用。

【例4-17】(以自适应线性神经网络实现噪声对消)对于一个最优的滤波器希望通过滤波将信号中的噪声去掉,这对于一般的滤波器来说很难完全做到。利用自适应线性神经网络实现噪声对消的原理:

24

上图中s为原始输入信号,假设为平稳的零均值随机信号;n0为与s不相关的随机噪声;
n1为与n0相关的信号;系统输出为ε;s+n0为ADALINE神经元的预期输出;y为ADALINE神经元的输出。则:

ε=s+n0-y

可知当y->n0时ε=s

关于噪声对消的原理可以参考文档:http://www.doc88.com/p-5718140232621.html
http://www.docin.com/p-376010503.html

源代码:

clear all;
%定义输入向量和目标向量
time=0.01:0.01:10;             %时间变量
noise=(rand(1,1000)-0.5)*4;    %随机噪声
input=sin(time);               %输入信号
p=noise;                       %将噪声作为ADALINE的输入向量
t=input+noise;                 %将噪声+信号作为目标向量
                               %创建线性神经网络
net=newlin([-1 1],1,0,0.0005);
%线性神经网络的训练
net.adaptParam.passes=70;
[net,y,output]=adapt(net,p,t);    %output为网络调整过程的误差
%绘制信号
hold on;
subplot(3,1,1);
plot(time,input,'r');
title('信号波形sin(t)');

subplot(3,1,2);
plot(time,t,'m');                  %绘制叠加信号
xlabel('t');
title('随机噪声波形sin(t)+noise(t)');
%绘制输出信号的波形
subplot(3,1,3);
plot(time,output,'b');
xlabel('t');
title('输出信号波形y(t)');

输出结果:

25

3,线性神经网络在信号预测中的应用。

源码:

clear all;
% 定义输入向量和目标向量
time=0.5:0.5:20;         %时间变量
y=(rand(1,40)-0.5)*4;    %定义随机输入信号
p=con2seq(y);            %将随机输入向量转换为串行向量
delays=[1 2];            %定义ADALINE神经元输入延迟量
t=p;                     %定义ADALINE神经元的数目向量
% 创建线性神经网络
net=newlin(minmax(y),1,delays,0.0005);
% 线性神经网络的自适应调整(训练)
net.adaptParam.passes=70;
[net,a,output]=adapt(net,p,t);  %输出信号output为网络调整过程中的误差
% 绘制随机输入信号\输出信号的波形
hold on;
subplot(3,1,1);plot(time,y,'r*-'); %输出信号output为网络调整过程中的误差
xlabel('t','position',[20.5,-1.8]);
ylabel('随机输入信号s(t)');
axis([0 20 -2 2]);
subplot(3,1,2);
output=seq2con(output);
plot(time,output{1},'ko-');  %绘制预测输出信号的波形
xlabel('t','position',[20.5,-1.8]);
ylabel('预测输出信号y(t)');
axis([0 20 -2 2]);
subplot(3,1,3);
e=output{1}-y;
plot(time,e,'k-');   %绘制误差曲线
xlabel('t','position',[20.5,-1.8]);
ylabel('误差曲线e(t)');
axis([0 20 -2 2]);
hold off;

输出:

26
从图上可以看出,输出信号波形与输入信号波形基本一致,误差较小,输出波形较好的预测了输入波形。

值得一提的还是学习速率与训练步长的选择。如果学习速率过大,即学习的过程将不稳定,且误差会更大;反正如果学习速率过小,学习的过程将变慢,需要的训练步长将加大。
就线性神经网络本身来说,其余感知器一样,只能解决线性可分的模式分类,但LMS算法比感知器的δ学习算法更有效,因为它使均方误差最小,可以使各分类模式远离判决边界,从而使网络具有更好 的抗噪性。另一方面,ADALINE网络至今仍然广泛应用于各种实际系统中,特别是在自适应滤波方面,用途更加广泛。

二,线性神经网络的局限性。

线性神经网络只能反映输入和输出样本矢量间的线性映射关系,与感知器一样,其也只能解决线性可分问题。 由于线性神经网络的误差曲面为一个多维抛物面,所以在学习速率足够小的情况下对于基于最下二乘梯度下降原理进行训练的线性神经网络总可以找到一个解。但是,线性神经网络的训练不一定总能达到零误差。如果线性神经网络的自由度(即线性神经网络所有权值和阈值的个数总和)小于训练样本集中”输入-目标“矢量的对数,而且各样本矢量线性无关,则网络训练不可能达到零误差,只能达到一个使网络误差最小的解;反之,如果网络自由度大于样本集的个数,即会得到无穷多个使网络训练误差为零的解。

上述关于自由度判断可以理解为:S*R+S>=Q;此时可以用线性神经网络来解决。
但是当输入样本线性相关或者没有阈值的时候,这个公式不使用。

1,学习速率过大。

学习速率的选取是影响收敛速度以及训练结果的重要因素。学习速率足够小,根据W-H学习规则总能训练网络满足精度要求;学习速率过大,可能会导致训练过程不稳定。MATLAB工具箱提供了函数maxlinlr来求正确的学习速率。
【例4-19】

P=[+1.0 -1.2];
T=[+0.5 +1.0];
w_range=-2:0.4:2;
b_range=-2:0.4:2;
ES=errsurf(P,T,w_range,b_range,'purelin');
plotes(w_range,b_range,ES);
maxlr=maxlinlr(P,'bias');
net=newlin([-2 2],1,[0],maxlr*2.25);
net.trainParam.epochs=20;
net.trainParam.epochs=1;
net.trainParam.show=NaN;
h=plotep(net.IW{1},net.b{1},mse(T-sim(net,P)));
[net,tr]=train(net,P,T);
r=tr;
epoch=1;
while epoch<20
    epoch=epoch+1;
    [net,tr]=train(net,P,T);
    if length(tr.epoch)>1
        h=plotep(net.IW{1,1},net.b{1},tr.perf(2),h);
        r.epoch=[r.epoch epoch];
        r.perf=[r.perf tr.perf(2)];
        v.vperf=[r.vperf NaN];
        r.tperf=[r.tperf NaN];
    else
        break
    end
end
tr=r;
solvednet=newlind(P,T);
hold on;
plot(solvednet.IW{1},solvednet.b{1},'ro')
hold off;
subplot(1,2,2);
plotperf(tr,net.trainParam.goal);
p=-1.2;
a=sim(net,p)

输出:

27

28

输出为:


a =

    2.0913

期望输出t=0.1,而网络输出a=1.0913。可见当学习速率选取过大时,误差越来越大,网络训练无法达到精度。

2,线性相关向量。

在应用线性神经网络之前首先要判断该问题是否能用线性神经网络来解决。通常,线性网络的自由度(权值与阈值总和S*R+S)至少要等于约束的数目(输入/输出样本数Q),这样才能应用。但是当输入样本相关或者没有阈值的时候,这种要求就可能不成立。如果线性相关的输入向量与期望输出向量之间并不匹配,那么此问题就是一个非线性问题,而且这个问题得不到零误差解。

【例4-20】假设输入向量和期望向量如下:
P=[1.0 2.0 3;4 5 6]
T=[0.5 1 -1]
可知输入向量具有相关性,而期望输出向量并不具备这种相关性,即输入/输出不匹配。那么即使有正确的学习速率等参数,结果也不如人意:

P=[1.0 2.0 3.0;4.0 5.0 6.0];
T=[0.5 1.0 -1.0];
maxlr=maxlinlr(P,'bias');
net=newlin([0 10;0 10],1,[0],maxlr);
net.trainParam.show=50;
net.trainParam.epochs=500;
net.trainParam.goal=0.001;
[net,tr]=train(net,P,T);
p=[1.0;4];
a=sim(net,p)

29

输出:

a =
0.8971

达到最大训练次数之后,仿真停止,但是训练精度没有的达到。可以得知:线性网络不能适应输入向量之间具有线性相关性的非线性问题。

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

MATLAB神经网络编程(四)——线性神经网络的实现与局限 的相关文章

  • 在 matlab/octave 中将数据集分成两个子集 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将数据集分为两个子集 例如 训练 和 测试 其中 训练集包含 80 的数据 测试集包含剩余的 20 分裂的意思是生成一个长度等于的逻辑索引
  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 在Matlab中对字符进行分组并形成矩阵

    我有 26 个字符 A 到 Z 我将 4 个字符组合在一起 并用空格分隔以下 4 个字符 如下所示 abcd efgh ijkl mnop qrst uvwx yz 我的Matlab编码如下 str abcdefghijklmnopqrst
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k

随机推荐

  • 2023年十大无代码测试工具 每个测试人员都应该知道

    编码 跟很多技能一样 需要多年的实践才能熟练掌握 让测试人员编写一堆代码组成测试程序 修复程序中的错误 并在几周内完成大量工作很有难度 根据2019 2020年世界质量报告 在敏捷项目中应用自动化测试的最大的问题就是很多测试人员缺乏专业编程
  • 双因素方差分析 matlab,MATLAB的双因素有交互效应的方差分析

    二 MATLAB的双因素有交互效应的方差分析在两个因素的试验中 不但每一个因素单独对试验结果起作用 往往两个因素的不同水平组合还会产生一定的合作效应 在方差分析中称为交互效应 交互效应在对因素方差分析中 通常是当成一个新因素来处理 设因素A
  • Django学习

    创建项目 django admin startproject mysite 目录结构如下 查看帮助 终端页面输入以下命令 django admin help django admin help Type django admin help
  • 缺陷检测数据集

    缺陷检测数据集 东北大学钢材表面缺陷数据集 铁质缺陷 东北大学钢材表面缺陷数据集 简介 该数据集是东北大学宋克臣团队制作而成 是钢材表面缺陷数据集 共有1800张图片 包含六种类型共有六种缺陷 crazing inclusion patch
  • Vue中路由vue-router的使用

    基本使用 1 安装vue router 命令 npm i vue router 2 应用插件 import VueRouter from vue router Vue use VueRouter 3 编写router配置项 import V
  • python中判断 nan 的几种方式

    float NaN 判断 float NaN float NaN pandas中的 nan 判断 pd isnull df1 df1 是DataFrame对象 也可以是Series对象 pd isna 直接判断DataFrame某一列是否为
  • Springboot自定义ThreadPoolTaskExecutor线程池多线程并发执行异步方法

    1 背景 当前因为工作需求 要发送大量Http请求 经过实践遍历发送需要6小时才能发送完毕 如果单线程发送请求会导致主线程阻塞 就会存在以下问题 前端用户等待响应时间过长 无法进行下一步操作 不利于用户操作系统 响应时间过长超过Tomcat
  • 内存分页

    内存分页 p Description 内存分页 p param records 待分页的数据 param pageNum 当前页码 param pageSize 每页显示的条数 return 分页之后的数据 public static
  • Git——C站最详细的Git教程,一篇学会Git(window\linux通用)

    Git C站最详细的Git教程 一篇学会Git window linux通用 文章目录 Git C站最详细的Git教程 一篇学会Git window linux通用 Git简介 Git 作用 为什么要进行源代码管理 Git的诞生 Git管理
  • vue双向数据绑定指令v-model

    vue双向数据绑定指令v model v model 被称为双向数据绑定指令 就是Vue实例对数据进行修改 页面会立即感知 相反页面对数据进行修改 Vue内部也会立即感知 v model 是vue中唯一实现双向数据绑定的指令 v bind
  • mybatis增删改查的写法集合

    增删改查的写法集合 注意 xml文件尽量不要注释 Usermapping public interface UserMapping 查询 List
  • mysql建_mysql简单建表

    NULL 和 NOT NULL 修饰符 可以在每个字段后面都加上这NULL 或 NOT NULL 修饰符来指定该字段是否可以为空 NULL 还是说必须填上数据 NOT NULL MySQL默认情况下指定字段为NULL修饰符 如果一个字段指定
  • 《Kafka系列》Java测试远程连接Kafka,实现生产者和消费者,发现两者数据不通?

    Java测试远程连接Kafka 实现生产者和消费者 发现两者数据不通 错误显示 错误排除 1 在网上看到有这种方法 修改Kafka下的conf下的server properties文件 cd opt apps kafka conf serv
  • Stream流

    概念 是JDK1 8的新语法 和IO流不是一个东西相当于流水线 很方便的对数据进行加工 Stream流把真正的函数式编程风格引入到Java中 代码简洁 Stream流不能直接修改数据源中的数据 不使用Stream流的优势是加工处理数据 每个
  • buuctf_Exec

    0x01 题目链接 BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台 为各位 CTF 选手提供真实赛题在线复现等服务 https buuoj cn challenges 0x02 题目 打开题目就看到大大的PING 二话不说
  • 在存储过程中使用了DML语句要不要调用COMMIT?

    要调用commit语句 或者正常退出sqlplus 系统会自动提交 dml语句不能自动提交 ddl语句和dcl语句可以自动提交 转自 http bbs csdn net topics 80160481
  • 胶囊体阴影

    官方介绍 虚幻引擎现在支持非常柔滑的间接阴影 由代表角色的胶囊体来进行投影 通常 在受间接光照时 并不会产生阴影 除非是屏幕空间环境遮罩 间接投影需要做的非常柔滑 因为间接光照是来自很多不同的方向 因此 传统的阴影贴图做法的效果并不好 间接
  • android windows 安装

    转自 http www cnblogs com skynet archive 2010 04 12 1709892 html 本系列适合0基础的人员 因为我就是从0开始的 此系列记录我步入Android开发的一些经验分享 望与君共勉 作为A
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决

    安防视频监控汇聚EasyNVR视频集中存储平台 是基于RTSP Onvif协议的安防视频平台 可支持将接入的视频流进行全平台 全终端分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等格式 为了满
  • MATLAB神经网络编程(四)——线性神经网络的实现与局限

    MATLAB神经网络编程 化学工业出版社 读书笔记 第四章 前向型神经网络 4 2 线性神经网络 本文是 MATLAB神经网络编程 书籍的阅读笔记 其中涉及的源码 公式 原理都来自此书 若有不理解之处请参阅原书 一 线性神经网络的实现 线性