MATLAB神经网络编程(三)——线性神经网络的构建与实现

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

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

首先定义一些神经网络中常用的参数意义,如下图:

定义

一,线性神经网络的构建。

1,生成线性神经元。

构建一个如下图所示的具有两个输入端的单神经元线性网络。

16

其权值矩阵W是一个行向量,网络输出a为:

a=purelin(n)=purelin(WP+b)=WP+b

或者:

a=w1,1*p1+w1,2*p2+b

与感知器一样,线性神经网络也有一个分界线,由输入向量决定,即n=0时,方程WP+b=0,分类示意图如下:

17

输入向量在分界线右上时,输出大于0;输入向量在左下时,输出小于0.这样,线性神经网络就可以用来研究分类问题;当然,前提是进行分类的问题是线性可分的,这与感知器的局限是相同的。

【例4-13】应用newlin设计一个双输入单输出线性神经网络,输入向量范围是[-1 1;-1 1],学习速率是1。

源代码是如下:

clear all
net=newlin([-1 1;-1 1],1);    %此时网络权值和阈值默认为0
W=net.IW{1,1}    %W=0 0
b=net.b{1}    %b=0
net.IW{1,1}=[2 3];  %分别设置网络的权值、阈值
net.b{1}=[-4];

p=[5;6];    %p是输入向量
a=sim(net,p)    %利用上面建立的网络判断p相应的输出a

输出是:
18

2,线性滤波器。
首先是应用于线性神经网络中的触发延迟线(这个到底是什么我是在不明白)。
若在线性神经网络中应用了触发延迟线,则产生的线性滤波器的输出:

19

这样的网络可以应用于信号处理滤波。
【例4-14】假设输入向量P,期望输出向量T,以及初始输入延迟P1。

源代码如下:

clear all
P={1 2 1 3 3 2};
P1={1 3};
T={5 6 4 20 7 8};
%应用newlind函数构造一个网络以满足上面的输入/输出关系和延迟条件
net=newlind(P,T,P1);
Y=sim(net,P,P1)    %验证网络的输出。

输出为:

20

二,网络训练。

自适应线性元件的网络训练过程可以归纳为三个步骤:
(1),表达。计算训练的输出矢量a=wp+b,以及与期望输出之间的误差e=t-a.
(2),检查。将网络的输出误差的平方和与期望误差相比较,如果其值小于期望误差,或者训练已经达到事先设定的最大训练次数,则停止训练,否则继续。
(3),学习。采用W-H学习规则计算新的权值和偏差,并返回第一步。
每进行一次上述三个步骤,就认为是完成一个训练循环次数。
如果经过训练,网络仍然不能达到期望目标,可以有两种选择:一是检查一下所要解决的问题,是否适用于线性网络;二是对网络进行进一步的训练。

虽然只适用于线性网络,W-H学习规则仍然是重要的,因为它展现了梯度下降法是如何来训练一个网络的,此概念后来发展成反射传播法,使之可以训练多层非线性网络。

【例4-15】考虑一个较大的神经元网络的模式联想的设计问题。输入矢量和目标矢量分别是:
P=[1 1.5 1.2 -0.3;-1 2 3 -0.5;2 1 -1.6 0.9];
T=[0.5 3 -2.2 1.4;1.1 -1.2 1.7 -0.4;3 0.2 -1.8 -0.4;-1 0.4 -1.0 0.6];

这个问题可以通过线性方程组的方式求出唯一的解,这是比较复杂,此时就可以通过自适应线性网络的方式得出有一定误差的解。
源代码:

clear all;
P=[1 1.5 1.2 -0.3;-1 2 3 -0.5;2 1 -1.6 0.9];
T=[0.5 3 -2.2 1.4;1.1 -1.2 1.7 -0.4;3 0.2 -1.8 -0.4;-1 0.4 -1.0 0.6];
[S,Q]=size(T);
max_epoch=400;    %最大训练次数
err_goal=100;
err_goal=0.001;
lr=0.9*maxlinlr(P);
%初始权值
W0=[1.9978 -0.5959 -0.3517;1.5543 0.05331 1.3660;...
    1.0672 0.3645 -0.9227 ;-0.7747 1.3839 -0.3384];
B0=[0.0746;-0.0642;-0.4256;-0.6433];
net=newlin(minmax(P),S,[0],lr);
net.IW{1,1}=W0;
net.b{1}=B0;
a=sim(net,P);
e=T-a;
sse=(sumsqr(e))/(S*Q);    %求误差平方和的平均值
fprintf('Before traing,sum squrared error=%g.\n',sse); %显示训练前的网络均方差
net.trainParam.epochs=400;    %最大循环次数
net.trainParam.goal=0.001;    %期望误差(均方差)
[net,tr]=train(net,P,T);
W=net.iw{1,1}
B=net.b{1}    %显示最终的权值

输出的结果:

21

22

对于存在零误差的精确权值网络,若用函数newlind来求解,则更加简单,上例可以用源代码如下:

clear all;
P=[1 1.5 1.2 -0.3;-1 2 3 -0.5;2 1 -1.6 0.9];
T=[0.5 3 -2.2 1.4;1.1 -1.2 1.7 -0.4;3 0.2 -1.8 -0.4;-1 0.4 -1.0 0.6];
[S,Q]=size(T);
b=[];
w=[];
a=[];
for i=1:S
    net=newlind(P,T(i,:));    %设计一个具有一个行向量的线性网络
    w=[w;net.iw{1,1}]
    b=[b;net.b{1}]
    a=[a;sim(net,P)]
end
w    %输出完整的偏差和权值
b
a    %显示网络的最终输出

23

因为newlind是按(行)向量序列的方式来构造和设计一个线性网络的,所以对于具有多输出神经网络的设计,需要经过多次循环来获得最终成果。

通常可以直接判断一个线性网络是否有完美的零误差的解。如果每个神经元所具有的自由度(权值与阈值的数量和)等于或者大于限制数(即输入或者输出的矢量对)【可以认为是公式:R+1>=Q】,那么线性网络可以零误差的解决问题。不过这一结论在输入矢量线性相关或者没有阈值时不成立。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值