神经网络技术(MATLAB实现)——感知机神经网络


感知机是一种前馈式的人工神经网络。它分为单层感知机和多层感知机。一般而言,单层感知机是用于二分类问题,而多层感知机增应用于多分类问题。就原理公式来讲,感知机的公式推导与机器学习中的线性回归十分相似。

原理简介

单层感知机模型

对于二分类问题,单层感知机使用符号函数作为激活函数(阈值元件)。
单计算节点感知机就是一个M-P神经元模型:
o j = { 1 , W j T X > 0 − 1 , W j T X < 0 o_j= \begin{cases} 1, & {W_j}^TX>0 \\ -1, & {W_j}^TX<0 \end{cases} oj={1,1,WjTX>0WjTX<0
设输入向量 X = ( x 1 , x 2 , x 3 ) T X=(x_1,x_2,x_3)^T X=(x1,x2,x3)T,则n个输入分量在集合上构成一个n维空间,由方程:
w 1 j x 1 + w 2 j x 2 + . . . + w n j x n − T j = 0 w_{1j}x_1+w_{2j}x_2+...+w_{nj}x_n-T_j=0 w1jx1+w2jx2+...+wnjxnTj=0
可定义一个n维空间上的超平面,此平面可以将输入样本分为两类。

感知机的学习

感知机的学习是一种导师学习方式,如果以t表示目标输出,a表示实际输出,则:
e = t − a e=t-a e=ta
网络训练的目标就是要使得 t → a t{\to}a ta
当e=0时,得到最优的网络权值和阈值;
当e>0时,得到的实际输出大于目标输出,应减小网络权值和阈值;
当e<0时,得到的实际输出小于目标输出,应增大网络权值和阈值。
一般感知机的传输函数为阈值型函数,网络的输出只可能为0或者1,所以只要网络表达的函数是线性可分的,则函数经过有限次迭代,将收敛到正确的权值和阈值,使得e=0。
感知机的训练步骤:
设n个训练样本构成的训练样本集为:
[ p 1 , t 1 ] , [ p 2 , t 2 ] , . . . , [ p n , t n ] {[p_1,t_1]},{[p_2,t_2]},...,{[p_n,t_n]} [p1,t1],[p2,t2],...,[pn,tn]
每一步学习过程,对于各层感知器神经网络的权值和阈值进行调整的算法为:
W ( k + 1 ) = W ( k ) + e p T W(k+1)=W(k)+ep^T W(k+1)=W(k)+epT
b ( k + 1 ) = b ( k ) + e b(k+1)=b(k)+e b(k+1)=b(k)+e
式中,e——误差向量;e=t-a;
W——权向量;
b——阈值向量;
p——输入向量;
k——第k步的学习过程。
权值的调整可以归一化算法:
W ( k + 1 ) = W ( k ) + e p T ∣ ∣ p ∣ ∣ W(k+1)=W(k)+e\frac{p^T}{||p||} W(k+1)=W(k)+eppT
∣ ∣ p ∣ ∣ = ∑ i = 1 m p i 2 ||p||=\sqrt{\sum_{i=1}^m{p_i}^2} p=i=1mpi2
式中,m——输入向量元素的个数。

感知机的训练

感知机的训练过程可总结为:
(1)对于所要解决的问题,确定输入向量P,目标向量T,并由此确定各向量的维数以及确定网络结构大小的神经元节点数目:r,s和q。
(2)参数初始化:
赋给权向量W在(-1,1)的随机非零初始值;
给出最大训练循环次数。
(3)网络表达式:根据输入向量P以及最新权向量W,计算网络输出向量A。
(4)检查:检查输出向量A与目标向量T是否相同,如果是,或已达到最大循环次数,训练结束,否则转入(2)。
(5)学习:根据感知机的学习规则调整权向量,并返回(3)。

标准感知机的学习规则

原始的感知机学习规则采用下式进行权值调整:
Δ w = ( t − a ) p T = e p T {\Delta}w=(t-a)p^T=ep^T Δw=(ta)pT=epT
从上式可见,输入向量p越大,权值的变化就越大。

多层感知机(MLP)

理论基础

多层感知机网络的信息是逐层前向传播的,下层的各单元与上一层的每个单元相连。输入单元按照输入/输出关系式逐层进行操作,每层之间的连接权值可以通过学习规则进行调整。可以看出,多层感知机实际上就是多个单层感知机经过适当组合设计而成的。他可以实现任何形状的划分。
多层感知机的隐单元的数目 n 1 n_1 n1有对应的上下限公式,可供设计时参考。如果需要对 k k k个输入样本进行分类,隐单元的数目最大值为k-1,最小值为 n 1 = m i n [ p ( n 1 , n ) ] > = k n_1=min[p(n_1,n)]>=k n1=min[p(n1,n)]>=k,其中, p ( n 1 , n ) = ∑ i = 0 n ( n 1 i ) p(n_1,n)=\sum_{i=0}^n \begin{pmatrix} n_1 \\ i \end{pmatrix} p(n1,n)=i=0n(n1i),当 n 1 < i n_1<i n1<i时, ( n 1 i ) = 0 \begin{pmatrix} n_1\\ i \end{pmatrix}=0 (n1i)=0

多层感知机的实现

定制网络的步骤:
(1)首先生成一个新的网络;在命令行窗口中输入以下代码后可生成一个类型未知的网络。
(2)设置网络的结构属性,包括层数、输入/输出量和权值等都是未知的。

%% 首先生成一个新的网络,并构建网络的结构属性,这些属性包括网络的输入层的数目、
%% 输入层之间的连接情况。
net=network;% 建立一个未知的新网络
net.numInputs=1;
net.numLayers=2;

(3)然后设置网络的阈值、输入权值、层的权值,输出与目标的连接情况等。本网络是一个前馈网络,所以层连接应该设置为[0 0;1 0],即信息只有通过第1层才可以传播到第2层,网络的输入只和第一层相连,两层都存在权值向量。第2层存在目标向量,输出也处于该层。

net.biasConnect=[1;1];
net.inputConnect=[1;0];
net.layerConnect=[0 0;1 0];
net.outputConnect=[0 1];

(4)接下来,需要设置各层的属性,包括神经元的个数、传递函数、输入向量的范围和初始化函数等。多层感知机的第一层有2个神经元,传递函数为硬限幅函数hardlim,输入向量的范围为[0,1];输出层即第2层,有1个神经元,传递函数一位影响函数hardlim。两层的初始化函数都采用initnw。

net.inputs{1}.range=[0 1;0 1];
net.layers{1}.size=2;
net.layers{1}.initFcn='initnw';
% net.layers{1}.size=1;
net.layers{2}.size=1;
net.layers{2}.transferFcn='hardlim';
net.layers{2}.initFc='initnw';

(5)最后,需要设置网络的整体属性,即性能函数、训练函数和初始化函数等。性能函数取均方差函数为mse,训练函数为trainlm,初始化函数为initlay,设置为:

net.adaptFcn='trains';
net.performFcn='mse';
net.trainFcn='trainlm';
net.initFcn='initlay';

感知机神经网络函数

1、newp函数

net=newp(PR,S,TF,LF);

可通过感知机生成函数创建一个感知机,并且可对感知机进行初始化、仿真和训练;
其中,参数PR为R*2的输入向量最大值和最小值构成的矩阵;S为神经元个数;TF是传输函数设置为hardlim函数或者hardlins函数,默认为hardlim函数;LF为学习函数设置,是learnp函数或者learnpn函数,默认为learnp函数。

2、显示函数

(1)plotpc函数
该函数用于在感知机向量图中绘制分界线。函数的调用格式为:

plotpc(W,B);

该函数对含权矩阵W和偏差向量B的硬特性神经元的两个或三个输入画一个分类线。
该函数返回一个句柄一遍后续调用。

plotpc(W,B,H);

包含从前的一次调用中返回的句柄,它在画新分类之前,删除旧线。
注意:该函数一般在plotpv函数之后调用,而且并不改变现有的坐标轴标准。
(2)plotpv函数
该函数用于绘制感知机的输入向量和目标向量,函数的调用格式:

plotpv(P,T);% 以T为标尺,绘制P的列向量
plotpv(P,T,V);% 在V的范围中绘制P的列向量

(3)mae函数
感知机的学习规则为调整网络的权值和偏值,使网络的平均绝对误差最小。平均绝对误差性能mae函数的调用格式为:

perf=mae(E,Y,X,FP);
dPerf_dy=mae('dy',E,Y,X,perf,FP);%输出参数表示返回perf对y的导数
dPerf_dx=mae('dx',E,Y,X,perf,FP);%输出参数dPerf_dx表示返回perf对x的导数
info=mae(code);% 根据code值的不同,返回不同的信息

其中,E为误差矩阵或向量(E=T-Y,Y表示网络目标向量);Y为网络的输出向量(可忽略);X为所有权值和偏值向量;FP为性能参数;perf表示平均绝对误差。
针对于info:
当code=name时,返回函数的全称;
当code=pnames时,返回训练参数的名称;
当code=pdefaults时,返回默认的训练参数
例题:
借助于感知机模型,设计出一个或门。

clear all;
P=[0 0 1 1;0 1 0 1];
T=[0 1 1 1];
net=newp(minmax(P),1);
Y1=sim(net,P)
net.trainParam.epochs=25;
net=train(net,P,T);
Y2=sim(net,P)
perf=mae(Y2-T)

利用平均绝对误差函数mae计算网络的性能,结果为0,从另一个方面说明了网络的性能是非常好的。
用自适应函数adapt同样可以达到训练的效果。

[net,Y,e]=adapt(net,P,T);

例题2:
使用而输入单神经元的感知机网络,对网络输入样本中存在奇异样本(即输入向量1远远大于其他所有的输入向量)进行训练。

clear all;
%输入向量和期望输出
P=[-0.5 -0.5 +0.3 -0.1 -40;-0.5 +0.5 -0.5 +1.0 50];
T=[1 1 0 0 1];
plotpv(P,T);            %效果如图4-16所示
net=newp([-40 1;-1 50],1);
hold on
linehandle=plotpc(net.iw{1},net.b{1});    
%应用初始网络无法分类,因此无法画出分类线
%网络修正
E=1;
net.adaptParam.passes=3;
while (sse(E))
    [net,Y,E]=adapt(net,P,T);
    linehandle=plotpc(net.IW{1},net.b{1},linehandle);  %效果如图4-17所示
    drawnow;
end
%可以用一组新的输入量来验证网络的性能
p=[0.7;1.2];
a=sim(net,p);
plotpv(p,a);
hold on
plotpv(P,T);
plotpc(net.IW{1},net.b{1});           %效果如图4-18所示
%为了使图形清晰,修改坐标值放大部分图形
axis([-2 2 -2 2]);  %效果如图4-19所示
hold off

例题3:
训练二层感知机模型并进行仿真运算

clear all;
%初始化随机感知器层
pr1=[0 1;0 1];              %设置随机感知器层输入问题每个元素的值域
net1=newp(pr1,3);           %定义随机感知器层
%指定随机感知器层权值初始化函数为随机函数
net1.inputweights{1}.initFcn='rands'; 
%指定随机感知器层阈值初始化函数为随机函数
net1.biases{1}.initFcn='rands';
net1=init(net1);           %初始化随机感知器层
iw1=net1.iw{1};            %随机感知器层的权值向量
b1=net1.b{1};              %随机感知器层的阈值向量
%随机感知器层仿真
p1=[0 0;0 1;1 0;1 1]';     %随机感知器输入向量(训练样本)
[a1,pf]=sim(net1,p1);      %随机感知器层仿真
%初始化第二感知器层
pr2=[0 1;0 1;0 1];         %设置第二感知器层输入向量每个元素的值域
net2=newp(pr2,1);          %定义第二感知器层
%训练第二感知器层
net2.trainParam.epochs=10;
net2.trainParam.show=1;
p2=ones(3,4);              %初始化第二感知器层的输入向量
p2=p2.*a1;           %随机感知器层的仿真输出结果作为第二感知器层的输入向量
t2=[0 1 1 0];              %第二感知器层的目标向量
%训练第二感知器层
[net2,tr2]=train(net2,p2,t2);
disp('输出训练过程经过的每一步长为:')
epoch2=tr2.epoch           %输出训练过程经过的每一步长
disp('输出每一步训练结果的误差为:')
perf2=tr2.perf             %输出每一步训练结果的误差
disp('第二感知器层的权值向量为:')
iw2=net2.iw{1}
disp('第二感知器层的阈值向量为:')
b2=net2.b{1}
%存储训练后的网络
save net36 net1 net2
 clear all;                   %清除工作空间中变量
load net36 net1 net2         %加载训练后的网络
%随机感知器层仿真
p1=[0 0;0 1;1 0;1 1]';       %随机感知器层输入向量
a1=sim(net1,p1);             %随机感知器层仿真结果
%输出感知器层仿真,并输出仿真结果
p2=ones(3,4);                %初始化第二感知器层的输入向量
p2=p2.*a1;          %随机感知器层的仿真输出结果作为第二感知器层的输入向量
a2=sim(net2,p2)

感知机应用于线性分类问题

可以把神经网络的实现功能看成是输入到输出的映射,如果把每一种不同的输入看成是一种输入模式,将其到输出的映射看成是输出响应模式,则输出入到输出的映射就编程输入模式空间到输出响应模式空间的映射。这种输入模式到输出模式的映射,就是模式分类问题。

决策函数与决策边界

模式分类的基本内容是确定判决函数与决策边界。对于C类分类问题,按照判决规则可以把特征向量空间(或模式空间)分成C个决策域。将划分决策域的边界称为决策边界,在数学上可以用解析形式将其表示成决策边界方程。用于表达决策规则的某些函数称为判决函数。
f ( n ) = f ( W p + b ) f(n)=f(Wp+b) f(n)=f(Wp+b)
一般来说,当模式p为一维时,决策边界为一分界点;当p为二维时,决策边界为一直线;当p为三维时,决策边界为一平面;当p为n维时,决策边界为一个超平面。

感知机的决策函数与决策边界

感知机神经元的传输函数为阈值型函数,如果传输函数为hardlim函数,则其决策函数为:
f ( u ) = h a r d l i m ( W p + b ) = { 0 ,Wp+b<0 1 ,Wp+b>=0 f(u)=hardlim(Wp+b)=\begin{cases} 0 & \text{,Wp+b<0} \\ 1 & \text{,Wp+b>=0} \\ \end{cases} f(u)=hardlim(Wp+b)={01,Wp+b<0,Wp+b>=0
其值只有0和1两种情况,所以决策边界有下列边界方程决定:
W p + b = 0 Wp+b=0 Wp+b=0
单层感知机只要一个边界方程,且为线性方程,所有它只能进行线性回归。

clear all;
%初始化感知器网络
pr=[-1 1;-1 1];   %设置感知器网络输入向量每个元素的值域
net=newp(pr,1);  %定义感知器网络
%训练感知器网络
p=[0.5 -1;1 0.5;-1 0.5;-1 -1]';  %输入向量(训练样本值)
t=[0 1 1 0];   %目标向量
[net,tr]=train(net,p,t);  %训练感知器网络
%网络仿真
a=sim(net,p)  %仿真结果
%绘制网络的分类结果及分类线
v=[-2 2 -2 2];   %设置坐标的范围
plotpv(p,a,v);  %绘制分类结果
plotpc(net.iw{1},net.b{1});  %绘制分类线
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值