转自:http://blog.csdn.net/u013455341/article/details/46747343

在《机器学习基石》这门课里面也进入了第一讲的内容,这次学习到的是Percetron Learning Algorithm——感知学习算法。

PLA用于解决的是对于二维或者高维的 线性可分 问题的分类,最终将问题分为两类——是或者不是。

注意PLA一定是针对线性可分的问题,即可以找到一条线,或者超平面去分开是和不是的两堆数据,如果不是线性可分。

可以通过后来的Pocket改正算法,类似贪心的法则找到一个最适合的。

一个很好的用于PLA的例子是银行要不要给用户发信用卡的问题。银行可以根据顾客的个人信息来判断是否给顾客发放信用卡。将顾客抽象为一个向量X,包括姓名、年龄、年收入、负债数等。同时设定各个属性所占的比例向量W,对于正相关的属性设置相对较高的比例如年收入,对于负相关的属性设置较低的比例如负债数。y表示是否想该用户发放了信用卡。通过求X和W的内积减去一个阀值,若为正则同意发放信用卡,否则不发放信用卡。我们假设存在着一个从X到Y的映射f,PLA算法就是用来模拟这个映射,使得求出的函数与f尽可能的相似,起码在已知的数据集上一致。

PLA算法即用来求向量W(用于预测的向量),使得在已知的数据中机器做出的判断与现实完全相同。当X为二维向量时,相当于在平面上画出一条直线将所有的点分成两部分,一部分同意发送,另外的不同意。内积可以表示成:

如果把(阈值*-1)当作Wo,x0当作1,公式可以化简为

这里面WT 就是用来做预测的向量,h(x)是假定求出来的预测函数,算法的关键就是去求w。

算法的思路可以简单这样理解,x相当于给定的已知值,wT 可能会把x带到正的那一边,也可能把x带到负的那一边。然而,最后可能正确的值是正的,却带到了负的。

正确是负的,却带到了正的。那么根据所给的训练集,可以不断的去修正这个Wt,以满足训练集的数据情况。

例如:

x的指向代表了y的布尔值。

上图的例子可以看到,如果x的实际指向是如果是正的,即y = +1,然而w的预测值却与x的夹角大于90,即预测到反方向 wT* x= -1。结果不正确。

那么可以通过y*x的纠正值来纠正w,这样新的w又会和x处于一个方向上了。两者点乘得出的值就是负的。

另外一种情况:

x的值指向负的,,y = -1。然而w 与 x 的夹角小于 90度,那么通过预测,wT* x= 1,结果也不正确。

同理可以加上一个y*x,来修正w。这样wT * x 又可以变成 -1了。

算法的思路就大概是这样:

  1. initialize w(0) = 0.
  2. for t = 0,1,2,....
  3. for i = 1,2,...,n
  4. w(t+1) = w(t) + y(i) * x(i);
  5. end
  6. 直到所有的点都预测正确为止。
  7. (线性可分的数据可以通过证明得出,这个循环最后一定会停下来,不会无限循环)
  8. end

算法证明(即线性可分可以得到终止):

这里我直接引用别人的算式结果了,计算过程写得比较清楚。

可以看到,运行次数T是存在上界的。意思就是如果给定的资料是线性可分,那么最后一定可以得到一个w,分开两个数据集。

PLA的优缺点:

1.首先,PLA的算法是局限在线性可分的训练集上的,然而我们拿到一个训练集,并不知道其到底是不是线性可分,如果不是,PLA的算法程序将无限循环下去,这样做是不可 行的。

2.即使训练集是线性可分,我们也不知道PLA什么时候才能找到一个合适的解,如果要循环很多次才能找到,这对于实际使用是开销很大的。

PLA改进——Pocket Algorithm:

针对不是线性可分的数据,这里提出了一个改进的算法。

思路是,能否找到一条分界线去分离两个数据集,使得错误率最低呢?

然而要准确找到一条错误率最低的,被证明出是一个NP问题,不能准确地找到。那么Pocket算法的思路就是,类似贪心,如果找到一个更好(错误率低)的w,那么就去更新,

如果找一个错误率更高的,那么就不去更新的,重新找。每次找一个随机的wt。对于所有数据都采用w(t+1) = w(t) + yn * xn; 修正一次。最后如果这个wt要比记录的最好值w‘犯的错误少,就更新最好值。

下面是伪代码:

  1. for t = 1,2,3...  (number of iteration)
  2. w(t) = random of w ;
  3. for i = 1,2,3...n
  4. w(t+1) = w(t) + y(i) * x(i);
  5. end
  6. if(cal_error(w(t+1)) < cal_error(w_best)))
  7. w_best = w(t+1);
  8. end

同理,Pocket算法也有它自己的缺点:

1.wt是随机的,可能算了很多次都没有找出一个更好的。

2.假设数据一开始就是线性可分,那么这个算法找出来的未必是最好解,且时间花费也可能比较大。

总结:

这次是第一次学习机器学习的内容,PLA的算法局限性比较大,一定要针对线性可分的数据,且只能用来做二元分类,如果是多元分类,恐怕还要进一步学习其他算法。

Pocket算法可以解决PLA线性可分的未知性,但是自身缺点也比较大,如果设定的迭代字数太少,可能找到的解不够好,太多又可能给计算带来太大开销。

PLA-机器学习基石2的更多相关文章

  1. 机器学习基石 2 Learning to Answer Yes/No

    机器学习基石 2 Learning to Answer Yes/No Perceptron Hypothesis Set 对于一个线性可分的二分类问题,我们可以采用感知器 (Perceptron)这种 ...

  2. 機器學習基石(Machine Learning Foundations) 机器学习基石 课后习题链接汇总

    大家好,我是Mac Jiang,非常高兴您能在百忙之中阅读我的博客!这个专题我主要讲的是Coursera-台湾大学-機器學習基石(Machine Learning Foundations)的课后习题解 ...

  3. 机器学习基石12-Nonlinear Transformation

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课介绍了分类问题的三种线性模型,可以用来解决binary classif ...

  4. 机器学习基石11-Linear Models for Classification

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课,我们介绍了Logistic Regression问题,建立cross ...

  5. 机器学习基石10-Logistic Regression

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课介绍了Linear Regression线性回归,用均方误差来寻找最佳 ...

  6. 机器学习基石8-Noise and Error

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课,我们主要介绍了VC Dimension的概念.如果Hypothese ...

  7. 机器学习基石7-The VC Dimension

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 前几节课着重介绍了机器能够学习的条件并做了详细的推导和解释.机器能够学习必须满 ...

  8. 机器学习基石第三讲:types of learning

    博客已经迁移至Marcovaldo's blog (http://marcovaldong.github.io/) 刚刚完毕机器学习基石的第三讲.这一讲主要介绍了机器学习的分类.对何种问题应该使用何种 ...

  9. 机器学习基石 5 Training versus Testing

    机器学习基石 5 Training versus Testing Recap and Preview 回顾一下机器学习的流程图: 机器学习可以理解为寻找到 \(g\),使得 \(g \approx f ...

  10. 机器学习基石 4 Feasibility of Learning

    机器学习基石 4 Feasibility of Learning Learning is Impossible? 机器学习:通过现有的训练集 \(D\) 学习,得到预测函数 \(h(x)\) 使得它接 ...

随机推荐

  1. WireShark抓包分析以及对TCP/IP三次握手与四次挥手的分析

    WireShark抓包分析TCP/IP三次握手与四次挥手 Wireshark介绍: Wireshark(前称Ethereal)是一个网络封包分析软件.功能十分强大,是一个可以在多个操作系统平台上的开源 ...

  2. js声明 对象,数组 的方法

    i={} 对象字面量 等同 i = new Object();i=[] 数组字面量 等同 i = new Array();

  3. Beego框架学习--(核心:数据交互)

    Beego框架学习记录 1.beego简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...

  4. Feign 自定义 ErrorDecoder (捕获 Feign 服务端异常)

    问题描述 Feign 客户端捕获不到服务端抛出的异常 问题解决 重新 ErrorDecoder 即可,比如下面例子中在登录鉴权时想使用认证服务器抛出 OAuth2Exception 的异常,代码如下: ...

  5. PyQt(Python+Qt)学习随笔:QAbstractItemView的editTriggers属性以及平台编辑键(platform edit key )

    老猿Python博文目录 老猿Python博客地址 editTriggers属性 editTriggers属性用于确认哪些用户操作行为会触发ItemView中的数据项进入编辑模式. 此属性是由枚举类E ...

  6. PyQt(Python+Qt)学习随笔:Qt Designer中toolBar的allowedAreas属性

    1.概述 allowedAreas属性指定工具栏允许移动的范围,其类型为枚举类Qt.ToolBarAreas,有如下取值: 以上取值可以同or操作组合使用. 2.访问方法 缺省值为Qt.AllTool ...

  7. IntelliJ IDEA 学习笔记

    之前一直用Eclipse,最近尝试使用IDEA,相较于 Eclipse 而言,IDEA强大的整合能力,比如: Git. Maven. Spring 等:提示功能的快速. 便捷:提示功能的范围广:好用的 ...

  8. 笔试题.NET基础代码面试题

    题目如下,本随笔只是记录,都是一些自身面经的题目,您既然点开了的话,学习下无妨,说不定有帮助呢 以下答案都经过博主一个个去运行过. 题目1 (实例化后 x=?;y=? 输出什么): public cl ...

  9. 团队作业4-Day1

    团队作业4-Day1 1. 各个成员在 Alpha 阶段认领的任务 Alpha任务分配 人员 小程序样式实现 吴安冬+吴梓华 小程序js代码及云数据实现 庾艺锋+白军强 项目测试 王泽鑫+赵玮锋 2. ...

  10. Scrum 冲刺第五天

    一.每日站立式会议 1.会议内容 1)进行每日工作汇报 张博愉: 昨天已完成的工作:学习如何编写测试计划 今日工作计划:学习如何编写用户手册 工作中遇到的困难:写文档也有很多讲究的点,花了很多时间 张 ...