在说起感知器之前,需要先说一下神经网络的定义:

神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。

感知器(M-P神经元模型)

 感知器(Perceptron)由两层神经元组成,如图所示,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”。在M-P神经元模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”(activation function)处理以产生神经元的输出。

理想中的激活函数是下图所示的阶跃函数,它将输入值映射为输出值“0”或“1”,显然“1”对应于神经元兴奋,“0”对应于神经元抑制。然而,阶跃函数具有不连续、不光滑等不太好的性质,因此实际常用Sigmoid函数作为激活函数,如图所示,它把可能在较大范围内变化的输入值挤压到(0,1)输出范围内,因此,有时也称为“挤压函数”。

把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。

感知器能很容易地实现逻辑与、或、非的运算,注意到

假定函数f为图(a)中的阶跃函数,且x1,x2的取值为0或1,下面通过有两个输入神经元的感知器来实现逻辑与、或、非的运算。

  • “与”(x1∧x2):令w1=w2=1,θ=2,则

仅在x1=x2=1时,y=1;

  • “或”(x1∨x2):令w1=w2=1,θ=0.5,则

当x1=1或x2=1时,y=1;

  • “非”(¬x1):令w1=-0.6,w2=0,θ=-0.5,则

当x1=1时,y=0;当x1=0时,y=1;

更一般地,给定训练数据集,权重wi(i=1,2,.... , n)以及阈值θ可通过学习得到,阈值θ可看作一个固定输入为-1.0的哑结点所对应的连接权重w(n+1),这样,权重和阈值的学习就可统一为权重的学习。

感知器权重(w)更新策略

感知器学习规则非常简单,对训练样例(x,y),若当前感知器的输出为,则感知器权重将这样调整:

其中η∈(0, 1)称为学习率(learning rate),从上式可看出,若感知器对训练样例(x,y)预测正确,即,则感知器不发生变化,否则将根据错误的程度进行权重调整。

单层感知器的缺陷

需要注意的是,单层感知器只有输出层神经元进行激活函数处理,即只拥有一层功能神经元(functional neuron),其学习能力非常有限,事实上,上述与、或、非问题都是线性可分的问题,可以证明,若两类模式是线性可分的,即存在一个线性超平面能将它们分开,感知器的学习过程一定会收敛(converge)而求得适当的权向量w=(w1;w2;.... ;wn;w(n+1));否则感知器学习过程将会发生振荡,w难以稳定下来,不能求得合适的解。即使是非常简单的非线性可分问题也不能解决,如:异或问题。

多层网络

要解决非线性可分问题,需要考虑使用多层功能神经元。例如图5.5中这个简单的两层感知器就能解决异或问题,在图中,输出层与输入层之间的一层神经元,被称为隐层或隐含层(hidden layer),隐含层和输入层神经元都是拥有激活函数的功能神经元

更一般地,常见的神经网络是形如图5.6所示的层级结构,每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络结构通常称为“多层前馈神经网络”,其中输入层神经元接收外界输入,隐层与输入层神经元对信号进行加工,最终结果由输出层神经元输出;换言之,输入层神经元仅是接受输入,不进行函数处理,隐层与输出层包含功能神经元。因此,图5.6(a)通常被称为“两层网络”,即称为单隐层网络,只需包含隐层,即可称为多层网络。神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴含在连接权阈值中。

利用感知器实现线性分类

接下来通过单层感知器来实现对样本的线性分类,这里选用的激活函数为符号函数:

为了处理方便,这里将x=0的情况归为sgn(0)=1,即

# 导入一些需要的包
import random
import numpy as np
import matplotlib.pyplot as plt
# 定义自定义的符号函数
def sign(vec):if vec >= 0:return 1else:return -1
# 训练权重和阈值
def train(train_num, train_datas, lr):  # lr为学习率w = [0, 0]b = 0for i in range(train_num):x = random.choice(train_datas)  # 从序列中获取一个随机元素x1, x2, y = x  # 把随机选取的样本的分量依次赋值给x1,x2,yif(y*sign((w[0]*x1 + w[1]*x2 + b)) <= 0):  # 训练算法,如果符号函数与输出结果不一致,则更新权重和阈值w[0] += lr*y*x1w[1] += lr*y*x2b += lr*yreturn w, b  # 最终返回训练完成的权重和阈值
# 通过画图来查看模型对样本分类的好坏
def plot_points(train_datas, w, b):plt.figure()  # 创建图表x1 = np.linspace(0, 8, 100)x2 = (-b-w[0]*x1)/w[1]  # 分类直线满足的方程plt.plot(x1, x2, color='r', label='y1 data')  # 画出分类直线datas_len = len(train_datas)  # 看有几行,几个样本for i in range(datas_len):if(train_datas[i][-1]==1):  # 正样本用圆点标记,向量的最后一个分量[-1],也可以用[2]plt.scatter(train_datas[i][0], train_datas[i][1], s=50)else:plt.scatter(train_datas[i][0], train_datas[i][1], marker='x',s=50)  # 负样本用x标记plt.show()  # 画图

在上段程序中,对于已经训练好的权重和阈值,满足:

所以有

# 执行程序
if __name__=='__main__':train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]]  # 正样本train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]]  # 负样本train_datas = train_data1 + train_data2  # 样本集print(train_datas)w, b = train(train_num=50, train_datas=train_datas, lr=0.01)  # 训练50次plot_points(train_datas, w, b)  # 画出样本点及分类直线

显示结果:

在以后的博客中,逐渐涉及多层神经网络的构建与应用,深入其中,更能体会到神经网络的奥妙。

参考:

1、机器学习/周志华著.--北京:清华大学出版社,2016(2017.3重印)

转载于:https://my.oschina.net/u/3888421/blog/2253176

感知器原理及线性分类技术实现相关推荐

  1. 用java实现基于感知器的数据线性分类

    感知器(perceptron) 是比较简单的二分类器,通过对训练样本集的学习,从而得到判别函数权值的解,产生线性可分的样本判别函数.该算法属于非参数算法,优点是不需要对各类样本的统计性质作任何假设,属 ...

  2. 基于 iris 数据集采用感知器 Perceptron 实现线性二分类

    基于 iris 数据集采用感知器 Perceptron 实现线性二分类 题目简述: 基于 iris 数据集(四个特征,三个类别),选取两个特征和两个类别,采用感知器 Perceptron 实现线性二分 ...

  3. 【深度学习】1:感知器原理,以及感知器解决异或问题

    前言: 写完上一篇<KNN算法实现手写数字识别>到现在已经过去了十天,2018年伊始几天同学同事都是各种浪,自己坚持学习实在是痛苦啊! 不悲不气,闲话不多说了,开始自己神经网络的学习旅程吧 ...

  4. CV之Face Detection:Face Detection人脸检测原理及其常见分类技术

    CV之Face Detection:Face Detection人脸检测原理及其常见分类技术 目录 人脸探测的原理 线性分类器 影像金字塔 滑动窗格 人脸探测的原理 将图片转为HOG图片以后,结合其他 ...

  5. CV之FR/FD:人脸识别之Face Detection人脸检测原理及其常见分类技术

    CV之FR/FD:人脸识别之Face Detection人脸检测原理及其常见分类技术 目录 人脸识别之Face Detection人脸检测原理及其常见分类技术 人脸探测的原理 线性分类器 影像金字塔 ...

  6. 深度学习--TensorFlow (2)单层感知器2 -- 实现多数据分类

    目录 一.基础理论 前向传递(得到输出y) 反向传递(更新权重w) 二.实现多数据分类 1.设置初始参数 2.训练 3.画图 3-1.画点 3-2.画线段 总代码 一.基础理论 这里只写公式,更加详细 ...

  7. TensorFlow2.0 Keras多层感知器模型imdb情感分类

    # 下载 import urllib.request import os import tarfileurl = 'http://ai.stanford.edu/~amaas/data/sentime ...

  8. 机器学习系列(一)感知器分类算法

    分类算法有两种类型:感知器和适应性线性神经元 神经元的数学表示 w=[w1w2...wm],x=[x1x2...xm]w=\begin{bmatrix} w_1 \\ w_2 \\ ... \\ w_ ...

  9. 【深度学习】感知器、线性神经网络案例应用、BP神经网络算法详细推导

    感知器.线性神经网络.BP神经网络及手写数字识别 1. 单层感知器 1.1 感知器的介绍 1.2 感知器的学习规则 1.3 感知器单输入输出示例 1.4 学习率 η\etaη 1.5 模型训练收敛条件 ...

最新文章

  1. 华为js面试题_四面腾讯与华为,大厂前端面试真BT!
  2. oracle rac服务供应商,【Oracle Database】Oracle RAC(八):服务资源管理
  3. leetcode-665-Non-decreasing Array
  4. 关于 Number() parsint() abs() 的区别
  5. 大数据分析工程师证书_CDA数据分析就业班、大数据就业班就业情况怎么样?
  6. html特殊字符p如何屏蔽 asp,利用asp去除html标记的四种方法
  7. ES权威指南[官方文档学习笔记]-12 more complicated searches
  8. npm publish发布包时出现403错误no_perms Private mode enable, only admin can publish this module:
  9. windows快速全局检索文件工具-Listary
  10. shell 小米system锁adb_小米解锁Bootloder和system分区,获取完整root
  11. c语言输出100以内素数用函数,用C语言 输出100以内的素数,
  12. Linux随笔14-私有CA搭建并签发证书、ssh客户端和服务器端常用参数
  13. Python函数定义的高级用法
  14. linux 好书推荐
  15. mybatis中显示更新数据成功 ,控制台显示成功,数据库数据却没有修改
  16. 基于国产FPGA紫光同创Titan2 PG2T390H的PCIe链式DMA控制器设计
  17. SWA Object Detection随机权重平均【论文+代码】
  18. 什么是soft matting方法_宜家的娃娃为什么这么”丑“
  19. 信息安全工程师-选择题(一)
  20. Lombok实现原理解析

热门文章

  1. 【Git】PyCharm项目关联Git的解决方案
  2. 【初等数论】指数、原根与不定方程
  3. linux系统用户锁定与解锁
  4. 【SQL Server备份恢复】数据库恢复:对page header的恢复
  5. 用程序解决所有文件的格式转换
  6. WZ132发现打CXY要么是程序员,要么是丑小鸭
  7. 今天的种到地下的cadfans2012
  8. 今天的弹指一瞬间的飞鸽传书
  9. 久游遭受重创的ng2b
  10. 我们一定要有自立的飞秋觉悟