我们有一堆数据,默认他们是线性可分的。 
定义f为这个数据分割线的最优解,但是我们不知道他的值。 
我们仅有一个函数集H,这个函数一般是无穷大的。我们的目的就是从H中找出一条线g来尽可能的接近f。但是,我刚刚说了,H内的函数一般是无穷多的,我们不可能把H中的函数一 一 比较,得到最好的分割线g吧!!!

不过伟大的科学家就说,我们的目的不就是找出一条线把这些数据都分开吗!!那我随机的初始化一条分割线 g0,让他一 一和数据点进行比较(数据总该是有限个的吧), 如果 某一个数据点划分对了,那这条线就不动,继续比较下一个点。如果错了,那就调整 这条线,让他能把这个点分对。以此下去,直到我们发现所有的点都分隔对了为止。。。

  1. 那么问题就来了,我们怎么调整这条分隔线呢??? 
    首先要明确,只有当分类出错误的时候,才对分割线进行调整。 
    假设我们遇到的数据点(xn,yn)是我们第t次分类错误。那么就有

    当yn=+1 时,则我们的错误结果为wTxn=wt−→∗xn−→=||w||∗||xn||∗cosΘ<0,即cosΘ<0 则Θ太大,为了能过纠正错误,决定减小Θ,就让w→t+1=w→t+x→ 
     
    紫色的就是更改后的wt+1

    同理 
    当yn=−1时,则我们的错误结果为wTxn=wt−→∗xn−→=||w||∗||xn||∗cosΘ>0,即cosΘ>0 则Θ太小,为了能过纠正错误,决定增大Θ,就让w→t+1=w→t−x→ 
     
    紫色的就是更改后的wt+1

    综上所述,当分割线遇到点(xn,yn)时,如果分割正确,那么wt就不变,如果分割错误,那么就令

    注意w是分割线wTx=0的法线,也就是说分割线的方向是与w的方向垂直的。。。

  2. 这个想法是挺好的,那么问题是,用这种方法到底行不行得通呢???现在,我们就来验证这个算法的正确性!!! 
    这种方法到底行不行得通,其实就是说这个算法到底能不能找到正确区分所有点的线。即这个算法到底能不能收敛?(收敛就是能停下来,算法只有找到了满足要求的线才停下来,所以说法不同,但意思是一样的) 
    证明: 
    首先有两个前提: 
    前提1:数据本就是可以线性可分的。(如果数据不是线性可分的话,那不管我们怎么找都找不到那条线) 
    前提2:我们仅仅是遇到分错的点时,才改变wt,遇到分对的点wt不变。

    根据前提1,说明最终的线一定存在。 
    假设wf是我们要的线,则有  
    当线wTtx=0遇到(xn,yn)发生错误时,则更新wt+1,即 
    遂有 
     
    则 

根据前提2,有 
 
又有

则 

判断w_t,wf是否相近,只需他们的Θ尽可能为0

我们初始化w0=0,则可以怎么得,在T次误差矫正后,有 
 
所以,最终得到

 
即cosΘ>=T−−√.Cconstant,即随着T逐渐增大,cosΘ也会逐渐增大,那么Θ会逐渐减小到0,所以wt是越来越接近wf 又cosΘ<=1,所以 wt一定收敛。

这个算法最大的缺点就是假设数据点是线性可分的。问题是,我们并不知道数据到底是不是线性可分的!!如果不是,也就是说最终根本没有上面的wf,即没有一条不犯错误的线,那么以上的推论都是“白搭”!!!

那怎么办???有个想法是,我们能不能把找出一条犯错误最少的线呢????即 
其实,从实际意义上,是不能的。这是一个著名的NP hard 问题!!!因为线有无穷多个啊!!!

伟大的科学家又提出一条算法,来解决这个问题——-口袋算法 
口袋算法基于贪心的思想。他总是让遇到的最好的线拿在自己的手上。。。 
就是我首先手里有一条分割线wt,发现他在数据点(xn,yn)上面犯了错误,那我们就纠正这个分割线得到wt+1,我们然后让wt与wt+1遍历所有的数据,看哪条线犯的错误少。如果wt+1犯的错误少,那么就让wt+1替代wt,否则wt不变。 
那怎样让算法停下来呢??——–我们就 自己规定迭代的次数 
由于口袋算法得到的线越来越好(PLA就不一定了,PLA是最终结果最好,其他情况就说不准了),所以我们就 自己规定迭代的次数 。 

  1. 最后一个问题,如果数据本就是线性可分,那么我们用 pocket algorithm 和用 PLA,那个更好??? 
    答案是PLA更好。先不说PLA可以找到最好的那条线。单从效率上来说,PLA也更好些。最主要的原因是,pocket algorithm 每次比较的时候,都要遍历所有的数据点,且两个算法都要遍历一遍,才会决定那个算法好,而这还是比较一次,如果我们让他迭代500次的,那就麻烦了!!!但是,所有前提是,数据是线性可分的。如果线性不可分,只能用pocket algorithm,因为PLA根本不会停下来(而且PLA的wt也不是每更改一次效果就会比之前的好)!!

总结一下,这篇博客讲了些什么: 
1. 先 讲解了 PLA算法 
2. 然后 证明PLA算法在数据是线性可分的情况下的正确性 
方法: 余弦定理+公式wt+1=wt+yn∗xn 
3. 讨论在线性不可分情况下的 口袋算法pocket algorithm 
4. 简单的讨论了 PLA和pocket algorithm的优缺点

5. 那么你能否将这些内容复述一遍 -_-

来自 丁磊_ml博客 网址为 blog.csdn.net/MosBest

分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm相关推荐

  1. 机器学习算法系列(一)- 感知器学习算法(PLA)

    阅读本文需要的背景知识点:数学基础知识.一丢丢编程知识 一.引言   前面一节我们了解了机器学习算法系列(〇)- 基础知识,接下来正式开始机器学习算法的学习,首先我们从最简单的一个算法--感知器学习算 ...

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

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

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

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

  4. Tensorflow中的多层感知器学习

    Tensorflow中的多层感知器学习 在这篇文章中,我们将了解多层感知器的概念和它在Python中使用TensorFlow库的实现. 多层感知 多层感知也被称为MLP.它是完全连接的密集层,可以将任 ...

  5. 逻辑斯第回归、softmax分类与多层感知器

    本专栏将推出一系列深度学习与图像处理相关的教程文章.注重原理精讲和代码实现.实现框架将重点选择Tensorflow或Pytorch.本讲从逻辑斯第回归入手,然后讲解softmax分类器,最后讲解多层感 ...

  6. 单层感知器线性分类、多层感知器非线性分类样例 调用matlab神经网络工具箱实现

    %给定样本输入向量P,目标输出向量T %net = newp(PR,S,TF,LF) %PR为输入矢量的取值范围的最大值和最小值 S为神经元的个数 TF为网络的传递函数 默认为hardlim LF为网 ...

  7. 计算智能——感知器模型

    主要内容 1.感知器总述 2.感知器模型 3.感知器策略(建立损失函数) 4.感知器算法(梯度下降和随机梯度下降) 4.1梯度下降 4.2随机梯度下降 5.感知器MATLAB简单实现 5.1newp函 ...

  8. 模式识别系列(一)感知器算法(PLA)

    目录 写在前头 1.感知器算法简介 2.Perceptron Learning Algorithm(PLA) 2.1权重向量和特征向量到分类面的距离 2.2PLA的原理和流程 2.3PLA的收敛性证明 ...

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

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

最新文章

  1. apply()智用:需要几个参数但只有一个参数数组
  2. ecplise中插件Jrebel的安装
  3. sentry 命令_sentry(二)集成sourcemap
  4. 【BZOJ3512】DZY Loves Math IV(杜教筛)
  5. 回文质数(洛谷P1217题题解,Java语言描述)
  6. 在java中对于构造函数_在Java语言中,下面有关于构造函数的描述正确的是()。
  7. [习题]给初学者的范例,多重字段搜寻引擎 for GridView,兼论 SqlDataSource与SelectParameter的用法...
  8. 《R与Hadoop大数据分析实战》一2.6 小结
  9. 自定义console.log字体样式
  10. c 语言编程怎样弄循环语句,C 语言循环语句
  11. SpringBoot系列(1):Spring和SpringBoot常用注解总结
  12. 盘点那些不为大众所知,却暗地里很“牛逼”的软件
  13. Javaweb安全——Java类加载机制
  14. Air202学习(4)官方例程(luat版)
  15. java基础-对15位或18位身份证号码的验证
  16. 电脑bios进入方法介绍
  17. 惠普电脑BIOS设置图文详细介绍
  18. LightSensor传感器
  19. C++实现聊天程序(QQ类型)
  20. AIX小型机在DLPAR之间移动磁带机

热门文章

  1. RDC TERM TABLE
  2. 基于便签纸的无限延生学习方法
  3. identification for completing the census
  4. unbuntu scim安装方法
  5. Android开源项目:GifView——Android显示GIF动画
  6. DDD理论学习系列(1)-- 通用语言
  7. Atitit 图像扫描器---基于扫描线
  8. json2.js参考
  9. 实现数据排序的几种方法
  10. C#SetWindowPos窗口置顶