博客已经迁移至Marcovaldo’s blog (http://marcovaldong.github.io/)
刚刚完成了机器学习基石的第二讲,主要介绍了机器学习的定义,PLA算法和pocket PLA算法。下面将笔记整理在下面。
Perceptron Hypothesis Set
延续前面的信用卡发放问题。银行已有的用户数据可能包括用户的年龄、年薪、工作时长、债务情况等特征信息,我们分别用x1,x2,…,xd来表示,那么对于每一个用户都有一个向量来表示其信息。我们为每一个特征信息分配一个权值wi,用来衡量该特征信息在此问题中的权重(例如,年薪对应的权值应该是一个正值,年薪越高越应该可以发放信用卡;债务对应的权值应该为一个负值,负债越多越不应该发放信用卡)。对于每一个用户,我们计算他的加权分值,若该加权分值超过某一个给定的阈值(threshold),那银行就给他信用卡;若未超过,则银行不予发放。现在,我们知道了问题的输入为一个个的d维向量,输出为y:{+1(good), -1(bad)},要求的hypothesis是一个线性函数,如下所示:
h(x)=sign((∑i=1dwixi)?threshold)
对于这样的hypothesis,我们称之为感知机(perceptron)。
我们将上式向量化,并将阈值加到前面的求和中,就变成了下面这样:
此时,x和权值向量w均为d+1维。下面给出一个二维平面上的perceptron hypothesis的例子,我们的perceptron要做的就是将图中的圈圈和叉叉给分开。
我们看到perceptron在二维平面上就是一条直线,其在更高维的空间呢应该以个超平面,所以我们说感知机是一个线性分类器。
下面是关于垃圾邮件分类的一个小测试:
perceptron Learning Algorithm(PLA)
现在我们知道了hypothesis是什么样的,那么我们怎样从H = all possible perceptrons中选择一条最好的呢?怎么去判断hypothesis的好坏呢,我们的思路是用这个hypothesis去处理已有的数据集,该hypothesis对已有数据的处理结果越正确则越好。就是说,如果又一个hypothesis对银行用户信息的处理结果与银行之前作出的信用卡发放决定都一致的话,那这个hypothesis就是好的。
hypothesis有无穷多个,那我们怎么去遍历呢?我们的思路是从某一条hypothesis出发,不断的去修正它,使其一次比一次变得好。修正的方法是这样的:对于一个hypothesis,对应其由一个wt,我们去找一个数据点(xn(t),yn(t)),有
sign(wTtxn(t))≠yn(t)
也就是说该hypothesis在数据点(xn(t),yn(t))处出现了错误,此时我们要对hypothesis做如下修正(至于为什么要做这样的修正,请看下图右侧的向量加减法的三角形表示):
wt+1←wt+yn(t)xn(t)
持续进行这样的修正,直至hypothesis在所有的数据点上均不出现错误(或者在尽可能少的点上有错误),知识我们就得到了一个比较好的hypotesis。
我们将这个算法称为PLA。下图是PLA算法的一个伪算法(当然还有对数据点的其他遍历方法):
然后视频中作了一个修正hypothesis的演示,这里省略。
前面我们说当hypothesis在任何数据点上都不犯错误的时候,算法就会停下来,那算法一定会停下来吗?就算算法会停下来,那我们最终得到的g肯定会很接近目标函数f吗?这是本小节遗留的两个问题,以后会介绍。
最后是小测试(对修正公式等号两边均左乘yn,再右乘xn就可以得出结果):
Guarantee of PLA
对于一个数据集中的两类数据点(一组是圈圈,一组是叉叉),当存在一条直线(或超平面)能够将圈圈和叉叉完全分开时,我们称这样的数据集时线性可分的(linear separable)。下图中给出了线性可分数据集和非线性可分的数据集。
对于线性可分的数据集D,存在一个完美的wf对于任意地数据点(xn,yn)均满足yn=sign(wTfxn)。我们假设wf就是目标f对应的参数,那我们来看一下每一次修正后的参数wt+1是不是比修正前的参数wt更接近wf呢?
通过上图中的推导,我们得到了wTfwt+1>wTfwt,这说明了什么呢?由向量内积的定义(向量a和向量b的内积为aTb=|a|?|b|?cosα,其中α是a和b的夹角),我们知道wt+1与wf的夹角αt+1比wt与wf的夹角αt要小(这里我们取wt+1和wt都是单位向量,下面再来说向量长度的问题),所以说wt+1比wt更接近wf。这也就说明了我们对参数wt的修正是有效的,我们的hypothesis会越来越接近目标f。
我们说hypothesis只有在犯错的时候才更新,才有
wt+1=wt+yn(t)xn(t)
我们作如下的一个推导:
从上面的推导,我们知道了wt每次更新都会有一个增长上限。视频中又说,我们从w0=0开始进行T次修正,会有
而上式的左边又不可能超过1(两个向量夹角的余弦值的上限),由此我们说循环一定可以停下来。
最后是小测试:
我从网上找到了一个解释,详情推导请见传送门(http://www.cnblogs.com/HappyAngel/category/348262.html),这里给出推导过程。
其实有了这个推导,我们才完全从数学上证明了PLA会在T次修正计算后停下来。
Non-Separable Data
前面我们说,如果数据集时线性可分的,那我们的PLA就一定会停下来。但我们事先是不知道数据集是否线性可分,而且初始的数据集中会含有噪声noise。在这种情况下,我们如何去找到一个好的hypothesis去很好的分开圈圈和叉叉呢?
既然我们现在无法找到不犯错误的hypothesis,那我们就去找一条犯的错误最少的hypothesis,这就引出了pocket PLA算法。
最后是小测试: