线性神经网络

时间:2022-04-28
本文章向大家介绍线性神经网络,主要内容包括自适应线性元件也是早期的神经网络模型之一,其学习算法称为LMS(Least Mean Squares)算法。Adaline网络与感知器网络非常相似,只是神经元的传输函数与不同而已。前者是线性传递函数,后者是对称硬极限传递函数。单层Adline网络和感知器网络一样,只能解决线性可分的问题,但其LMS学习规则却比感知器学习规则强得多。、二、线性神经网络的训练、三、线性神经网络函数、2. 传递函数、3. 学习函数、四、线性神经网络的局限性、五、线性网络的应用、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

自适应线性元件也是早期的神经网络模型之一,其学习算法称为LMS(Least Mean Squares)算法。Adaline网络与感知器网络非常相似,只是神经元的传输函数与不同而已。前者是线性传递函数,后者是对称硬极限传递函数。单层Adline网络和感知器网络一样,只能解决线性可分的问题,但其LMS学习规则却比感知器学习规则强得多。

感知器学习规则训练的网络,其分类的判决边界往往离各分类模型靠的比较近,这使得网络对噪声十分敏感;而LMS学习规则则使均方误差最小,从而使判决边界尽可能远离分类模式,增强了网络的抗造能力。旦LMS算法只是英语单层网络的训练,当需要多层网络设计时,需要找新的学习算法,如BP算法。

一、LMS学习率的选择

学习率η越少,算法运行时间就越长,算法也就记忆了更多过去的数据,因此学习率η的倒数反映了LMS算法的记忆容量大小。

η往往需要根据经验选择,1996年Hayjin证明,只要学习率η满足下式,LMS算法就是按方差收敛的:

又可以写成

二、线性神经网络的训练

1.表达。计算训练的输出向量A=W*P+B,以及与期望输出之间的误差E=T-A。

2.检查。将网络输出误差的平方和与期望误差相比较,如果其值小于期望误差或训练达到事先设定的最大训练次数,则停止训练,否则继续。

3.学习。采用W-H学习规则计算新的权值和偏差,并返回到步骤1.

三、线性神经网络函数

1.创建函数

(1)newlin函数

newlin函数用于创建一个线性层,在matlab中推荐使用linearlayer函数。所谓线性层,是一个单独的层次,它的权函数为dotprod,输入函数欸netsum,传递函数为purelin。线性层一般用作信号处理和预测中的自适应滤波器。

net = newlin(PR,S,ID,LR)

其中,PR为由R个输入元素矩阵;S为输出向量的数目;ID为输入延迟向量,默认值为【0】,LR为学习速率,默认值为0.01;net返回值为一个新的线性层。

(2)linearlayer函数

在matlab 2014b以后就用linearlayer替代newlin函数,该函数的格式为:

linearlayer(inputDelays,widrowHoffLR)

其中inputDelays为输入延迟的行向量,默认为1:2;widrowHoffLR为学习速率,默认值为0.01。

(3)newlind函数

该函数可以设计一个线性层,它通过输入向量和目标向量来计算线性层的权值和阈值,函数的调用格式如下:

net = newlind(P,T,Pi)

其中P为Q组输入向量组成的RxQ维矩阵;T为Q组目标分类向量组成的SxQ维矩阵;Pi为初始输入延迟状态的ID个单元阵列。

2. 传递函数

在matlab中,线性传递函数的调用格式为:

A=purelin(N,FP)

其中,N为SXQ维的网络输入列向量,FP为性能参数,返回网络输入向量N的输出矩阵A。

3. 学习函数

四、线性神经网络的局限性

线性神经网络只能反映输入和输出样本向量间的线性映射关系,和感知器神经网络一样,它也只能解决线性可分问日。由于线性神经网络的误差曲面是一个多维抛物面,所以在学习速率足够小的情况下,对于基于最小二乘梯度下降原理进行训练总可以找到一个最优解。但是,尽管如此,对线性神经网络的训练并不一定总能达到零误差。线性神经网络的训练性能要受网络规则和训练样本集大小的限制。如果线性神经网络的自由度(即神经网络所有权值和阈值的个数总和)小于训练样本集中“输入-目标”向量的对数,且各样本向量线性无关,则网络训练不可能达到零误差,而只能得到一个网络误差最小的解。此外,值得注意的是,线性神经网络的训练和性能都要受到学习速率参数的影响,过大的学习速率可能会导致网络性能发散。

权值w和偏差b所决定的线性网络误差图,可以看出它是一个抛物面。

lr=menu('选择学习速率:',...
'1.2*maxlinlr',...
'2.8*maxlinlr');
disp('')
disp_freq=1;
max_epoch=28;
err_goal=0.001;
if lr==1
    lp.lr=1.2*maxlinlr(p,'bias');
else
    lp.lr=2.8*maxlinlr(p,'bias');
end
a=W+p+B;
A=purelin(a);
E=t-A;
see=sumsqr(E);%求误差
errors=[see];%求误差矩阵元素的平方和
figure(1);
for epoch=1:max_epoch
 if see<err_goal
        epoch=epoch-1;
 break;
 end
    lw=W;
    lb=B;
    dw=learnwh([],p,[],[],[],[],E,[],[],[],lp,[]);
    db=learnwh([],ones(1,Q),[],[],[],[],E,[],[],[],lp,[]);
    W=W+dw;
    B=B+db;
    a=W*p+B;
    A=purelin(a);
    E=t-A;
    see=sumsqr(E);
    errors=[errors see];%把误差变为一个行向量
 if rem(epoch,disp_freq)==0
        hold on;
        plot([lw W],[lb,B],'g-');
        drawnow
 end
end
figure(2);
hold off;
m=W*p+B;
a=purelin(m);
plot(a)

五、线性网络的应用

1.逻辑与

clear all;

% 定义变量

p=[0 0 1 1;0 1 0 1];

t=[0 0 0 1];

lr=maxlinlr(p,'bias');%根据输入矩阵求解最大学习速率

% 线性网络实现

net1=linearlayer(0,lr);

net1=train(net1,p,t);

% 感知器实现

net2=newp([-1 1;-1 1],1,'hardlim');

net2=train(net2,p,t);

%显示

disp('线性网络输出:')

y1=sim(net1,p)

disp('线性网络二值输出:')

y11=y1>=0.5

disp('线性网络最终权值:')

w1=[net1.iw{1,1},net1.b{1}]

disp('感知器网络输出:')

y2=sim(net2,p)

disp('感知器网络二值输出:')

y22=y2>=0.5

disp('线性网络最终权值:')

w2=[net2.iw{1,1},net2.b{1}]

% 图形窗口输出

plot([0,0,1],[0,1,0],'ro');

hold on;

plot(1,1,'bd');

x=-2:0.2:2;

y1=1/2/w1(2)-w1(1)/w1(2)*x-w1(3)/w1(2);

plot(x,y1,'-');

y2=-w2(1)/w2(2)*x-w2(3)/w2(2);

plot(x,y2,'--');

axis([-0.5 2 -0.5 2]);

xlabel('x');

ylabel('y');

title('线性神经网络用于求积与逻辑')

legend('0','1','线性神经网络分类面','感知器分类面');

2.逻辑异或

clear all;

p1=[0 0 1 1;0 1 0 1];

p2=p1(1,:).^2;

p3=p1(1,:).*p1(2,:);

p4=p1(2,:).^2;

p=[p1(1,:);p2;p3;p4;p1(2,:)];

t=[0 1 1 0];

lr=maxlinlr(p,'bias');%根据输入矩阵求解最大学习率

%线性网络实现

net=linearlayer(0,lr);

net=train(net,p,t);

y1=sim(net,p);

w1=[net.iw{1,1},net.b{1}];

plot([0 1],[0 1],'ro');

hold on;

plot([0 1],[1 0],'d');

axis([-0.1 1.1 -0.1 1.1]);

xlabel('x');ylabel('y');

title('线性网络用于求解异或逻辑');

x=-0.1:0.1:1.1;

y=-0.1:0.1:1.1;

N=length(x);

X=repmat(x,1,N);

Y=repmat(y,N,1);

Y=Y(:);

Y=Y';

p=[X;X.^2;X.*Y;Y.^2;Y];

yy=net(p);

y1=reshape(yy,N,N);

[C,h]=contour(x,y,y1);

clabel(C,h,0.5);

legend('0','1','线性网络分类面');

3.滤噪

图中s为原始输入信号,假设为平稳的零均值随机信号;

n0为与s不想关的随机信号;

n1为u与n0相关的信号;

系统输出为ε;

s+n0为ADALINE神经元的预期输出;

y为ADALINE神经元的输出。则

通过ADALINE调节,得到

上式中,当Emin[(n0-y)2]->0时,y->n0,其输出ε为s,则噪声被抵消。

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;

% 输出信号output为网络调整过程中的误差

[net,y,output]=adapt(net,p,t);

hold on;

subplot(3,1,1);

plot(time,input,'r')

title('信号波形sin(t)');

subplot(312);

plot(time,t,'m');

xlabel('t');

title('随机噪声波形sin(t)+noise(t)');

% 绘制输出信号的波形

subplot(313);

plot(time,output,'b');

xlabel('t');

title('输出信号波形y(t)');

输出信号除了含有一定的直流分类外,其波形与输入波形基本一直,消除了迭加的随机噪声。