阅读本文需要的背景知识点:数学基础知识、一丢丢编程知识

一、引言

  前面一节我们了解了机器学习算法系列(〇)- 基础知识,接下来正式开始机器学习算法的学习,首先我们从最简单的一个算法——感知器学习算法(Perceptron Learning Algorithm)开始。
  我们在使用电子邮件时,应该注意到现代邮箱都有反垃圾邮件的功能,系统根据邮件的内容自动判断是否是垃圾邮件,节省了我们的时间,试想一下这个功能应该如何实现呢?

  我们可以先收集一批邮件,总结出对判断是否是垃圾邮件有用的一些特征值(例如:邮件是否包含链接、邮件出现过多少个营销词语、邮件的发送时间等等),然后对每一封邮件先人工的判断是否是垃圾邮件,最后试图通过这些数据来找到里面所包含的关联关系。以后给到一封新邮件的时候,我们就可以通过这些关系来判断是否是垃圾邮件了。

二、模型介绍

  回想一下在初中生物教材上介绍过的神经细胞,它是由树突、轴突、突触和细胞体组成的结构体。神经细胞是否激活并输出电信号是由其接收到的输入信号量和突触的强度所决定的,当其总和超过某个阈值时,细胞体就会激动并输出电信号。由这一神经细胞的行为,人们提出了感知器的概念和对应的感知器学习算法。
  感知器1(Perceptron)是一种二元线性分类器,将一个线性可分的数据集通过线性组合分成两种类型。在人工神经网络领域中,感知机也被指为单层的人工神经网络。
  几何意义:在二维平面内找到一条直线将两种类型的数据完全分开。在高维空间里为找到一个超平面将两类数据分开。

By Elizabeth Goodspeed - Own work, CC BY-SA 4.0

  数学定义:把矩阵上的输入 X(实数值向量)映射到输出值 h(x) 上(一个二元的值 -1 或 +1 )。假设存在 d 个 x ,通过 w 的加权求和,大于某个临界值时返回 +1,小于某个临界值时返回 -1。
∑ i = 1 d w i x i > 临界值  + 1 ( A 分类  ) ∑ i = 1 d w i x i < 临界值  − 1 ( B 分类  ) \begin{array}{cc} \sum_{i=1}^{d} w_{i} x_{i}>\text { 临界值 } & +1(A \text { 分类 }) \\ \sum_{i=1}^{d} w_{i} x_{i}<\text { 临界值 } & -1(B \text { 分类 }) \end{array} ∑i=1d​wi​xi​> 临界值 ∑i=1d​wi​xi​< 临界值 ​+1(A 分类 )−1(B 分类 )​

  将上式写成一个函数的形式(sign函数称为符号函数2,当输入小于 0 则输出 -1,当输入大于 0 则输出 +1)
h ( x ) = sign ⁡ ( ∑ i = 1 d w i x i − 临 界 值 ) h(x) = \operatorname{sign}\left(\sum_{i = 1}^dw_ix_i - 临界值\right) h(x)=sign(i=1∑d​wi​xi​−临界值)

  将负的临界值当作第 0 个 w,正1 当作第 0 个 x
h ( x ) = sign ⁡ ( ( ∑ i = 1 d w i x i ) + ( − 临界值  ) ⏟ w 0 ⋅ ( + 1 ) ⏟ x 0 ) h(x)=\operatorname{sign}(\left(\sum_{i=1}^{d} w_{i} x_{i}\right)+\underbrace{(-\text { 临界值 })}_{w_{0}} \cdot \underbrace{(+1)}_{x_{0}}) h(x)=sign((i=1∑d​wi​xi​)+w0​ (− 临界值 )​​⋅x0​ (+1)​​)

  可将临界值合到从 1 到 d 的连加运算中,则连加运算的下界变为 0
h ( x ) = sign ⁡ ( ∑ i = 0 d w i x i ) h(x) = \operatorname{sign}\left(\sum_{i=0}^dw_ix_i\right) h(x)=sign(i=0∑d​wi​xi​)

  最后函数可改写为两个向量(w、x)的点积形式
h ( x ) = sign ⁡ ( w T x ) h(x) = \operatorname{sign}\left( w^Tx \right) h(x)=sign(wTx)

  感知器是一种特别简单的线性分类模型,但是它的本质缺陷是不能处理线性不可分的问题,后面的小节将介绍一个可以允许存在一些错误的发生,能处理线性不可分数据集的算法——口袋算法(Pocket Algorithm)

三、算法步骤

  感知器学习算法(Perceptron Learning Algorithm)- 其核心思想就是以错误为驱动,逐步修正错误最后收敛的过程。

初始化向量 w,例如 w 初始化为零向量
循环 t = 0,1,2 …
  按顺序或随机遍历全部数据并计算 h(x) ,直到找到其中一个数据的 h(x) 与目标值 y 不符
sign ⁡ ( w t T x n ( t ) ) ≠ y n ( t ) \operatorname{sign}\left(w_{t}^{T} x_{n(t)}\right) \neq y_{n(t)} sign(wtT​xn(t)​)​=yn(t)​
  修正向量 w
w t + 1 ← w t + y n ( t ) x n ( t ) w_{t+1} \leftarrow w_{t}+y_{n(t)} x_{n(t)} wt+1​←wt​+yn(t)​xn(t)​
直到全部数据的结果都没有错误退出循环,所得的 w 即为一组方程的解

四、原理证明

  假设最后的目标权重系数为 w f w_f wf​,待优化的权重系数为 w w w。通过单位 w f w_f wf​ 与单位 w w w 的点积来作为两个向量是否靠近的标准。(两个单位向量的点积越大,说明两个向量越接近,当两个向量同向并共线时两者的点积最大)
  由于目标权重系数 w f w_f wf​ 的全部分类都是正确的,所以每一个数据点计算出的值与目标值的乘积必然大于乘积中的最小值,并且大于 0(分类正确即同号)

y n ( t ) w f T x n ( t ) ≥ min ⁡ n y n w f T x n > 0 y_{n(t)} w_{f}^{T} x_{n(t)} \geq \min _{n} y_{n} w_{f}^{T} x_{n}>0 yn(t)​wfT​xn(t)​≥nmin​yn​wfT​xn​>0

(公式一)

  待优化的权重系数为 w 只在数据集分类错误的时候做更新,所以在该数据点计算出的值与目标值的乘积必然小于等于 0(分类错误即异号)
sign ⁡ ( w t T x n ( t ) ) ≠ y n ( t ) ⇔ y n ( t ) w t T x n ( t ) ≤ 0 \operatorname{sign}\left(w_{t}^{T} x_{n(t)}\right) \neq y_{n(t)} \Leftrightarrow y_{n(t)} w_{t}^{T} x_{n(t)} \leq 0 sign(wtT​xn(t)​)​=yn(t)​⇔yn(t)​wtT​xn(t)​≤0

(公式二)

  权重系数更新规则
w t = w t − 1 + y n ( t ) x n ( t ) w_{t}=w_{t-1}+y_{n(t)} x_{n(t)} wt​=wt−1​+yn(t)​xn(t)​

(公式三)

由上面的三个公式可以得到目标权重系数与待优化的权重系数的点积的一个下界:
(1)将公式三带入可得
(2)展开后,使用公式一将第二项替换
(3)经过 T 轮更新后,必然大于等于 w 0 + T w_0 + T w0​+T 个最小值
(4)初始的权重系数为零向量
w f T w t = w f T ( w t − 1 + y n ( t − 1 ) x n ( t − 1 ) ) ≥ w f T w t − 1 + min ⁡ n y n w f T x n ≥ … ≥ w 0 + T ⋅ min ⁡ n y n w f T x n ≥ T ⋅ min ⁡ n y n w f T x n \begin{aligned} w_{f}^{T} w_{t} &=w_{f}^{T}\left(w_{t-1}+y_{n(t-1)} x_{n(t-1)}\right) \\ & \geq w_{f}^{T} w_{t-1}+\min _{n} y_{n} w_{f}^{T} x_{n} \\ & \geq \ldots \\ & \geq w_{0}+T \cdot \min _{n} y_{n} w_{f}^{T} x_{n} \\ & \geq T \cdot \min _{n} y_{n} w_{f}^{T} x_{n} \end{aligned} wfT​wt​​=wfT​(wt−1​+yn(t−1)​xn(t−1)​)≥wfT​wt−1​+nmin​yn​wfT​xn​≥…≥w0​+T⋅nmin​yn​wfT​xn​≥T⋅nmin​yn​wfT​xn​​

由上面的三个公式可以得到待优化的权重系数模的平方的一个上界:
(1)将公式三带入可得
(2)展开平方式
(3)中间一项由公式二可知必然小于等于 0,所以可以化简
(4)由于目标值 y 只有 +1 与 -1 ,所以平方必然为 1,每一个数据点模的平方必然小于等于最大的数据点模的平方
(5)经过 T 轮更新后,必然小于等于 w 0 w_0 w0​ 模的平方 + T 个最大的数据点模的平方
(6)初始的权重系数模的平方为 0
∥ w t ∥ 2 = ∥ w t − 1 + y n ( t − 1 ) x n ( t − 1 ) ∥ 2 = ∥ w t − 1 ∥ 2 + 2 y n ( t − 1 ) w t − 1 T x n ( t − 1 ) + ∥ y n ( t − 1 ) x n ( t − 1 ) ∥ 2 ≤ ∥ w t − 1 ∥ 2 + 0 + ∥ y n ( t − 1 ) x n ( t − 1 ) ∥ 2 ≤ ∥ w t − 1 ∥ 2 + max ⁡ n ∥ x n ∥ 2 ≤ … ≤ ∥ w 0 ∥ 2 + T ⋅ max ⁡ n ∥ x n ∥ 2 ≤ T ⋅ max ⁡ n ∥ x n ∥ 2 \begin{aligned} \left\|w_{t}\right\|^{2} &=\left\|w_{t-1}+y_{n(t-1)} x_{n(t-1)}\right\|^{2} \\ &=\left\|w_{t-1}\right\|^{2}+2 y_{n(t-1)} w_{t-1}^{T} x_{n(t-1)}+\left\|y_{n(t-1)} x_{n(t-1)}\right\|^{2} \\ & \leq\left\|w_{t-1}\right\|^{2}+0+\left\|y_{n(t-1)} x_{n(t-1)}\right\|^{2} \\ & \leq\left\|w_{t-1}\right\|^{2}+\max _{n}\left\|x_{n}\right\|^{2} \\ & \leq \ldots \\ & \leq\left\|w_{0}\right\|^{2}+T \cdot \max _{n}\left\|x_{n}\right\|^{2} \\ & \leq T \cdot \max _{n}\left\|x_{n}\right\|^{2} \end{aligned} ∥wt​∥2​=∥∥​wt−1​+yn(t−1)​xn(t−1)​∥∥​2=∥wt−1​∥2+2yn(t−1)​wt−1T​xn(t−1)​+∥∥​yn(t−1)​xn(t−1)​∥∥​2≤∥wt−1​∥2+0+∥∥​yn(t−1)​xn(t−1)​∥∥​2≤∥wt−1​∥2+nmax​∥xn​∥2≤…≤∥w0​∥2+T⋅nmax​∥xn​∥2≤T⋅nmax​∥xn​∥2​

由上面两个推导结果可知单位 w f w_f wf​ 与单位 w w w 的点积的下界
(1)带入上面两个推导结果可得
(2)化简提出唯一一个变量
(3)由于第二个乘数里面所有项都是常数且都为正数,所以单位 w f w_f wf​ 与单位 w w w 的点积的下界只与循环次数 T 有关
w f T ∥ w f ∥ w t ∥ w t ∥ ≥ T ⋅ min ⁡ n y n w f T x n ∥ w f ∥ T ⋅ max ⁡ n ∥ x n ∥ 2 ≥ T ⋅ min ⁡ n y n w f T x n ∥ w f ∥ max ⁡ n ∥ x n ∥ 2 ≥ T ⋅ 常数  \begin{aligned} \frac{w_{f}^{T}}{\left\|w_{f}\right\|} \frac{w_{t}}{\left\|w_{t}\right\|} & \geq \frac{T \cdot \min _{n} y_{n} w_{f}^{T} x_{n}}{\left\|w_{f}\right\| \sqrt{T \cdot \max _{n}\left\|x_{n}\right\|^{2}}} \\ & \geq \sqrt{T} \cdot \frac{\min _{n} y_{n} w_{f}^{T} x_{n}}{\left\|w_{f}\right\| \sqrt{\max _{n}\left\|x_{n}\right\|^{2}}} \\ & \geq \sqrt{T} \cdot \text { 常数 } \end{aligned} ∥wf​∥wfT​​∥wt​∥wt​​​≥∥wf​∥T⋅maxn​∥xn​∥2 ​T⋅minn​yn​wfT​xn​​≥T ​⋅∥wf​∥maxn​∥xn​∥2 ​minn​yn​wfT​xn​​≥T ​⋅ 常数 ​

  由上面的结论可知,当循环次数增大时,点积越大,说明两个单位向量越接近。而由于单位向量的点积最大为 1,说明循环次数 T 存在一个上界,所以算法最后会停下来。

五、代码实现

使用 Python 实现 PLA:

import numpy as npdef pla(X, y):"""感知器学习算法实现注意:只能处理线性可分的数据集,输入线性不可分的数据集函数将无法停止args:X - 训练数据集y - 目标标签值return:w - 权重系数"""done = False# 初始化权重系数w = np.zeros(X.shape[1])# 循环while(done == False):done = True# 遍历训练数据集for index in range(len(X)):x = X[index]# 判定是否与目标值不符if x.dot(w) * y[index] <= 0:done = False# 修正权重系数w = w + y[index] * xreturn w

六、第三方库实现

scikit-learn3实现:

from sklearn.linear_model import Perceptron# 初始化感知器
clf = Perceptron()
# 用随机梯度下降拟合线性模型
clf.fit(X, y)
# 权重系数
w = clf.coef_

七、示例演示

简单训练数据集分类:

复杂训练数据集分类:

八、思维导图

九、参考文献

  1. https://zh.wikipedia.org/wiki/%E6%84%9F%E7%9F%A5%E5%99%A8
  2. https://zh.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E5%87%BD%E6%95%B0
  3. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html

完整演示请点击这里

注:本文力求准确并通俗易懂,但由于笔者也是初学者,水平有限,如文中存在错误或遗漏之处,恳请读者通过留言的方式批评指正

本文首发于——AI导图,欢迎关注

机器学习算法系列(一)- 感知器学习算法(PLA)相关推荐

  1. 分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm

    我们有一堆数据,默认他们是线性可分的.  定义f为这个数据分割线的最优解,但是我们不知道他的值.  我们仅有一个函数集H,这个函数一般是无穷大的.我们的目的就是从H中找出一条线g来尽可能的接近f.但是 ...

  2. 【Python-ML】感知器学习算法(perceptron)

    1.数学模型   2.权值训练 3.Python代码 感知器收敛的前提是两个类别必须是线性可分的,且学习速率足够小.如果两个类别无法通过一个线性决策边界进行划分,要为模型在训练集上的学习迭代次数设置一 ...

  3. Machine Learning---感知器学习算法

    转载自:http://blog.csdn.net/stan1989/article/details/8565499 引言 这里开始介绍神经网络方面的知识(Neural Networks).首先我们会介 ...

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

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

  5. 神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现

    Rosenblatt感知器收敛算法C++实现 算法概述 自己用C++实现了下,测试的例子和模式用的都是双月分类模型,关于双月分类相关看之前的那个笔记: https://blog.csdn.net/u0 ...

  6. 神经网络算法-论证单层感知器的局限性

    神经网络算法-论证单层感知器的局限性 今天课上学习了一个思路 将真值表转换到平面直角坐标系中 来论证线性可分还是不可分,挺有意思记录一下. 简单感知器模型实际上仍然是MP模型的结构,但是它通过采用监督 ...

  7. ML之NB:基于news新闻文本数据集利用纯统计法、kNN、朴素贝叶斯(高斯/多元伯努利/多项式)、线性判别分析LDA、感知器等算法实现文本分类预测

    ML之NB:基于news新闻文本数据集利用纯统计法.kNN.朴素贝叶斯(高斯/多元伯努利/多项式).线性判别分析LDA.感知器等算法实现文本分类预测 目录 基于news新闻文本数据集利用纯统计法.kN ...

  8. AI实战:从入门到精通系列——用感知器实现情感分类(一)

    前言 人工智能的第一次高潮始于上世纪50年代.在算法方面,感知器数学模型被提出用于模拟人的神经元反应过程,并能够使用梯度下降法从训练样本中自动学习,完成分类任务. 感知器 感知器算法在上个世纪50-7 ...

  9. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

最新文章

  1. python学习之matplotlib绘制动图(FuncAnimation()参数)
  2. EVC4.0+AdoCe3.1访问Access数据库全攻略(附带说明及例程)
  3. Redis的简单实践
  4. boost::hana::zero用法的测试程序
  5. 详解分布式协调服务 ZooKeeper
  6. python导出数据顿号做分隔符_Python语言和matplotlib库做数据可视化分析
  7. zillow房价预测比赛_Kaggle竞赛 —— 房价预测 (House Prices)
  8. 3招seo技巧让你把关键词做进百度前三
  9. 格密码教程(三):基础域概念,体积等;阿达马不等式,行列式
  10. QString、QByteArray 相互转换、和16进制与asc2转换
  11. BZOJ 2186 SDOI2008 沙拉公主的困惑 数论
  12. [转]Linux下用gcc/g++生成静态库和动态库(Z)
  13. Mybatis工作中常用动态SQL总结
  14. awg线径与电流_awg线径对照表(awg线径与电流对照表)
  15. CTF常见用法小总结
  16. matlab 隐函数求偏导数,隐函数求偏导数的方法.PDF
  17. 青岛大学计算机专业春考,青岛大学春季高考分数线2020
  18. 华为java一个月写多少行代码_[财经]阿里员工吐槽华为:面试官1万行代码都没写过? - 南方财富网...
  19. 【DBeaver】安装与使用教程
  20. Delphi实现多线程

热门文章

  1. 机器自动翻译古文拼音 - 十大宋词 - 扬州慢 淮左名都 姜夔
  2. nvcc: command not found
  3. 基于Arduino、ESP8266的物联网项目开发方案整理、毕业设计(第一波)
  4. 什么是蜘蛛统计 有什么作用?
  5. 捷径智慧物业系统助力“书香小区”建设
  6. 单工通信、半双工通信、全双工通信 的概念
  7. PVE虚拟机开启支持虚拟化
  8. Latex——连乘符号
  9. 美团前端组件化开发实践
  10. 一些实用的零零散散的知识