神经网络的初认识——单层感知器(7月11,12)

单层感知器

属于单层前向网络,及除输入层和输出层外,只拥有一层神经元节点。输入数据从输入层向输出层逐层传播,相邻两层的神经元之间相互连接,同一层神经元之间没有连接。
在这里插入图片描述
可以说在隐含层上有两个元件,一个是线性组合器,一个是二值阙值元件。
输入是一个N维向量X=[x1 x2 x3 ,…XN],其中的每一个分量都对应与一个权值wi,隐含层的线性组合器可以得到一个值(标量):
在这里插入图片描述
然后在二值阙值元件中得到的V值进行判断,产生二值输出:
在这里插入图片描述
单层感知器的功能就是可以将输入数据分为两类:L1或L2。当y=1时,输入数据为L1,当y=-1,输入数据为L2。
在实际应用中,输入除了有N维向量外,还会有一个外部偏置,值恒为1,权值为b。即1*b;
会输入到线性组合器中,然后在二值阙值元件(使用类似于符号函数)重新判断,式子为:
在这里插入图片描述
而且可以知道的是上面的式子单独去看是一条直线,斜率为wi;
单层感知器的网路结构发生小小的改变。
在这里插入图片描述
以及其二值分类函数
在这里插入图片描述
可以从这里看出,判断的临界依据是V=0,那么便能引申出:
在这里插入图片描述
这个便是加了偏置后,二值阙值元件的判断依据——模式识别的超平面。

其学习算法过程

从上面的式子中可以知道需要将权值和偏置选择合适,才能将数据完美的分开,但是在实际应用中,是计算机根据训练数据学习来获得正确合适的权值,通常词用纠错学习规则的学习算法。
举例说明:
定义(n+1)*1的输入向量:

x(n)=[1 x1 x2 x3 ......xn]

定义(n+1)*1的权值向量:

W(n)=[b w1 w2 w3 w4....wn] 为什么是(N+1)呢,请看下图

在这里插入图片描述
然后就能得到线性组合器的输出值的公式为:在这里插入图片描述
这条式子大多数都是进行矩阵运算,也不需要刻意去使用转置,只要输入分量和权值分量一一对应就行。令该式子为0,便可以得到二分的决策面(区别);
在二值阙值元件中使用的函数是在下文中提及的传递函数Hardlim函数,得到的实际结果便可以与期望结果做比较。

学习算法步骤

在这里插入图片描述

初始化,n=0,将权值向量设置为0,或者是随机值。

在这里插入图片描述
这里的意思是开始进行计算,判断输入的样本是属于哪种类型(L1 L2);

在这里插入图片描述
这是第三步的结果。

在这里插入图片描述
这里的学习速率是一个随机数,具体的内容还没了解;
我觉得这里更新权值可以放在判断是否收敛后再进行。

在这里插入图片描述
继续训练,即继续减少误差。

收敛判断

当权值向量w已经能正确实现分类时,算法就收敛了,此时网络误差为0,字计算时,收敛的条件可以是:

1,误差小于某个预先设定的较小的值,高数里面的收敛的定义;
2,两次迭代之间的权值变化已经很小;
3,设定最大的迭代次数M,迭代M次后算法就停止迭代。

在这里插入图片描述

感知器的缺陷

在这里插入图片描述

相关函数详解

创建一个感知器

%P是一个R*2矩阵,矩阵的行数R等于感知器网络中输入向量的维数,即输入个数。矩阵的每一行则表示输入向量的取值范围
%net=perceptron(P,T,TF,LF);  T表示输出节点的个数  TF是指传递函数,LF是指学习函数。
p=[-1 , 1;-1 ,1];   
t=1;
net=newp(p,t,'hardlim','learnp');  %这里完成创建,接下来是训练;
%用于训练的数据样本:每列是一组输入向量
P=[0 0 1 1;
   0 2 0 1];
T=[0 1 1 1 ];%输入数据的期望输出
net=train(net,P,T);  %训练完后就是测试数据

A=[0 ,0.8]';
A1=sim(net,A)

会得到:
在这里插入图片描述
可见创建的感知器网络有两个输入节点,一个输出节点。

训练感知器网络——train

[net, tr]=train(net,P,T,PI,AI]
其中
    net是需要训练的网络。
    P是R*Q个输入矩阵,每一列是一组输入向量,Q是指需要训练的组数。
    T是指网络的期望输出,这个参数是可选的,对于无监督学习,不需要期望输出:T=S*Q,T是指输出节点,Q是指输出的次数。
    Pi是指输入延迟,默认为0;
    Ai是隐含层和输出层延时,默认为0;
    tr是指训练记录,包括训练的的步数和性能

使用感知网络的一个典型流程就是使用newp创建一个感知器网络net,然后用train函数根据训练数据对net进行训练,最后用sim进行仿真

实例

创建一个感知器,用来判断输入数字的符号,非负输出为1,负数输出为0;

p=[-100 100];%输入数据是标量,取值范围是-100 100
t=1;%输出节点设为1;
net=newp(p,t);%创建一个感知器网络;
P=[-5 -4 -3 -2 -1 0 1 2 3 4 5];%输入训练数据;
T=[0  0  0  0  0  1 1 1 1 1 1 ];%输入网络期望输出
net=train(net,P,T);%训练感知器网络;

A=10;
A1=sim(net,A)
B=-10;
A2=sim(net,B)
C=30;
A3=sim(net,C)

感知器的传输函数——hardlim和hardlims

在这里插入图片描述

A=hardlim(N,FP);

在这里插入图片描述

init——神经网络初始化

net=init(net);

在这里插入图片描述
上面的功能是为了初始化神经网络net的权值和阈值,那么我们就来看看创建中的权值:
在这里插入图片描述
隐含层只有一个神经元,所以输出为:
在这里插入图片描述
然后接着是训练后,感知器网络的权值,看看是否发生了变化:
在这里插入图片描述
在这里插入图片描述
可以看见再训练后,权值发生了改变。而且训练完成后,权值就不会再改变。
对于偏置权值也是一样的代理,调用的函数是:

net.b{1}:%是指第一个隐含层的偏置。

然后我们对感知网络进行初始化,是权值和偏置都恢复为0;
adapt——神经网络的自适应
在这里插入图片描述
在这里插入图片描述
沿用之前的训练样本,发现其误差为0;
在这里插入图片描述
在使用train函数训练过后,网络误差为0;
但是在使用train函数训练之前,情况是这样的:

P=[-5 -4 -3 -2 -1 0 1 2 3 4 5];%输入训练数据;
T=[0  0  0  0  0  1 1 1 1 1 1 ];%输入网络期望输出
[net,y,ee,pf]=adapt(net,P,T);
ma=mae(ee)
B1=sim(net,-20);%没有进行训练,直接仿真

在这里插入图片描述
而且会发现,无论仿真的时候输入任何数,得到的结果都是1;然后我们现在就可以发现在输入为负数的情况下,输出不是为0,而是为1.误差为-1;在这里插入代码片
在这里插入图片描述
接下来便是使用对感知器网络进行调整;

[net,y,ee,pf]=adapt(net,P,T);
ma=mae(ee);
ite=0;
while ma>0.1
    [net,y,ee,pf]=adapt(net,P,T,pf);
    ma=mae(ee);
    B=sim(net,P);
    ite=ite+1;
    if ite>=10
        break;
    end
end

可以得到:依然存在误差,但是结果已经十分接近期望值;(是不是就是说与train函数是一样的意思
在这里插入图片描述
于是我就改了一下代码:

while ma>0
    [net,y,ee,pf]=adapt(net,P,T,pf);
    ma=mae(ee);
    B=sim(net,P);
    ite=ite+1;
    if ite>=10
        break;
    end
end

可以知道的是,adapt函数与train函数是一样的。

mae——平均绝对误差性能函数

perf=mae(e); e为误差向量构成的矩阵或细胞数组

还有一个点需要注意的是:绝对值计算

平均绝对误差:
mae=|e|\N;
均方误差:
mse=(e^2)\n
误差平方和:
sse=e^2;

实例

最后用一个实例来加深对单层感知器的理解,首先我们知道的是该网络最大的功能就是二分类;
在这里插入图片描述
这幅图中给出几个点,我们设计一个单层感知器来将他分成两类点;
分类如下:
在这里插入图片描述
这是一个线性可分问题,输入向量为2维向量(X,Y);在二维空间中们可以用一条直线将其正确的分开;
在这里插入图片描述
同时也知道输入向量维数为2维,输出维数为去,因此创建的感知器网络的结构如下图:

在这里插入图片描述
现在我们知道的量有输入向量,输出量,所以我们可以得到:
根据前面出现的定义与公式:
在这里插入图片描述
把偏置也作为输入向量,b变量乘以1。

n=0.2;  %学习率
w=[0,0,0]; %权值和偏置初始化 [b, w11, w12]
P=[-9 1 -12 -4 0 5;
   15 -8 4 5 11 9];
d=[0 1 0 0 0 1];  %期望输出
p=[ones(1,6);P];
max=20;         %训练次数最大为20次;
%训练
i=0;
while 1
    v=w*p;          %线性组合器
    y=hardlim(v);   %计算实际输出
    e=(d-y);        %计算误差
    ee(i+1)=mae(e)  %计算绝对值误差
    if(ee(i+1)<0.001)
        x=ee(i+1)  %最后的绝对值误差
        y=i+1      %迭代计算的次数
        break;
    end
    %更新权值和偏置
    w=w+n*(d-y)*p';    
    i=i+1;          %进行下次计算
    if(i>=max)
        break;
    end
end

w1=w(1)           %训练后的偏置
w2=w(2)           %训练后的权值1
w3=w(3)           %训练的权值2

%显示
figure;
subplot(2,1,1);
plot([-9 -12 -4 0],[15 4 5 11],'o');
hold on ;
plot([1,5],[-8,9],'*');
axis([-13 6 -10 16]);
legend('第一类','第二类');
x=-13:2:6;
%wi*xi+b=0;
y=x*(-w(2)/w(3))-w(1)/w(3);   %计算并显示二分类的线 这里输入的是训练后的权值和偏置
plot(x,y);
hold off;

在训练后可以得到以下结果:
在这里插入图片描述
在这里插入图片描述
我们也可以用
在这里插入图片描述
这条式子来验证以下上面的权值是否正确:
找出线上任意一点:(1,1.914)和权值(b=-0.4 w1=7 w2=-3.4) 得到的结果近似于0,这样我们可以更加来了解这个单层感知器。

结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值