MATLAB神经网络编程(一)——感知器

MATLAB神经网络编程(一)——感知器

http://blog.csdn.net/fieldoffier/article/details/44264715

《MATLAB神经网络编程》 化学工业出版社 读书笔记 
第四章 前向型神经网络 4.1 感知器网络


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


感知器可以说是最早的人工神经网络(Artificial Neural Network,ANN),单层感知器是一个具有一层神经元、采用阈值激活函数的前向神经网络网络。

感知器的输出一般是0或1,当然也可以是-1或+1,实现对输入的矢量进行分类的目的。 
前向神经网络(Feed Forword Neural Network):各个神经元接受前级输入,并输出到下一级,无反馈,可用一有向无环图表示。 
前馈网络通常分为不同的“层”(layer),第i层的输入只与第i-1层的输入联接。 
可见层:输入层(input layer)与输出层(output layer) 
隐藏层(hidden layer):中间层。

(一)感知器的结构

单层感知器神经元模型 
单层感知器的神经元模型

上图中每一个输入分量pj(j=1,2…..r)通过一个权值分量wj(j=1,2….r)进行加权求和,并作为阈值函数的输入,偏差b的加入使得网络多一个参数,可以作为调节输出的值增加方便。

n=∑ wj*pj+b 
a=f(n)

多层感知器的模式如下: 
多层感知器

感知器中的函数f称为传输函数,感知器中一般选择阈值函数作为传输函数如 
hardlim

hardlims

感知器特别适合解决简单的模式分类(pattern classification)问题。但是单层感知器只能解决线性可分的问题。

(二)感知器的学习 
感知器学习的目的是找到合适的权值与阈值,使得感知器的输出、输入之间满足线性可分的函数关系。学习的过程往往很复杂,需要不断的调整权值与阈值,称为“训练”的过程。 
若以t表示目标输出,a表示实际输出,则

e=t-a

训练的目的就是使t->a. 
一般感知器的传输感受为阈值函数网络的输出a只能是0或1,所以只要网络表达的函数是线性可分的,则函数经过有限次迭代之后,将收敛到正确的权值与阈值,使e=0。 
感知器的训练需要提供样本集,每个样本由神经网络的输入向量和输出向量对构成,n个训练样本构成的样本集为: 
{p1,t1},{p2,t2}~~~~{pn,tn} 
每一步学习过程,对各个神经元的权值与阈值的调整算法是:

训练公式 
式子中W为权值向量;b为阈值向量;p为输入向量;k为第k步学习过程。上述学习过程称为标准化感知器学习规则,可以用函数learnp实现。

如果输入向量的取值范围很大,一些输入值太大,而一些输入值太小,按照上述公式学习的时间将会很长。为此,阈值的调整可以继续按照上述公式,而权值的调整可以采用归一化方法,即 
公式2
上述归一化学习方式可以使用函数learnpn实现。

(三)感知器的神经网络训练函数

Matlab的神经网络工具箱提供了大量的感知器函数。

newp

newp2

train

learn

sim

上述图片截图自:http://www.docin.com/p-209646585.html 
函数的具体使用方式以及原理可以在MATLAB命令窗口中使用命令:help+函数名 查看。

(四)在MATLAB中实现一个简单的感知器 
给定样本输入向量P,目标向量T以及需要进行分类的输入向量Q,设计一个单层感知器,对Q进行分类。 
源代码如下:

<code class="hljs matlab has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">clear all;
P=<span class="hljs-matrix" style="box-sizing: border-box;">[-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.6</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.7</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.8</span>;<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.9</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]</span>;    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%输入向量,即训练集</span>
T=<span class="hljs-matrix" style="box-sizing: border-box;">[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]</span>;                    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%输出向量</span>
net=newp(<span class="hljs-matrix" style="box-sizing: border-box;">[-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%生成感知器,net是返回参数</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%返回划线的句柄,下一次绘制分类线时%将旧的删除</span>
he=plotpc(<span class="hljs-transposed_variable" style="box-sizing: border-box;">net.</span>iw<span class="hljs-cell" style="box-sizing: border-box;">{<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>}</span>,<span class="hljs-transposed_variable" style="box-sizing: border-box;">net.</span>b<span class="hljs-cell" style="box-sizing: border-box;">{<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>}</span>);
<span class="hljs-transposed_variable" style="box-sizing: border-box;">net.</span><span class="hljs-transposed_variable" style="box-sizing: border-box;">trainParam.</span>epochs=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>;     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%设置训练次数最大是15</span>
net=train(net,P,T);           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%利用训练集对感知器进行训练</span>
Q=<span class="hljs-matrix" style="box-sizing: border-box;">[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.8</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.2</span>;-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.2</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.6</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.6</span>]</span>;
Y=sim(net,Q)                  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%Y是利用感知器net对Q进行分类的结果</span>
figure;
plotpv(Q,Y);                  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%画出输入的结果表示的点</span>
he=plotpc(<span class="hljs-transposed_variable" style="box-sizing: border-box;">net.</span>iw<span class="hljs-cell" style="box-sizing: border-box;">{<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>}</span>,<span class="hljs-transposed_variable" style="box-sizing: border-box;">net.</span>b<span class="hljs-cell" style="box-sizing: border-box;">{<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>}</span>,he)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">%画出分类线</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

训练的过程忽略,下图是最后得到的分类结果图:

P1

P2

由图可知,在经过两次训练后网络目标误差达到要求。

(五)小结 
感知器是最简单的神经网络,只适合进行简单的模式分类;感知器只对线性可分的向量集合进行分类,所谓线性可分,是指可以用一条直线(针对二维向量)或者一个平面(针对三维向量)将输入向量分开;对感知器的分析有助于理解更加复杂的神经网络。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值