马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
x
本帖最后由 姜宝胜 于 2018-3-15 09:21 编辑
引入这样一个例子:某银行要根据用户的年龄、性别、年收入等情况来判断是否给该用户发信用卡。现在有训练样本D,即之前用户的信息和是否发了信用卡。这是一个典型的机器学习问题,我们要根据D,通过A,在H中选择最好的h,得到g,接近目标函数f,也就是根据先验知识建立是否给用户发信用卡的模型。银行用这个模型对以后用户进行判断:发信用卡(+1),不发信用卡(-1)。 我们把用户的个人信息作为特征向量x,令总共有d个特征,每个特征赋予不同的权重w,表示该特征对输出(是否发信用卡)的影响有多大。那所有特征的加权和的值与一个设定的阈值threshold进行比较:大于这个阈值,输出为+1,即发信用卡;小于这个阈值,输出为-1,即不发信用卡。感知机模型,就是当特征加权和与阈值的差大于或等于0,则输出h(x)=1;当特征加权和与阈值的差小于0,则输出h(x)=-1,而我们的目的就是计算出所有权值w和阈值threshold。
为了更清晰地说明感知机模型,我们假设Perceptrons在二维平面上,直线一侧是正类(+1),直线另一侧是负类(-1)。权重w不同,对应于平面上不同的直线。 根据上一部分的介绍,我们已经知道了hypothesis set由许多条直线构成。接下来,我们的目的就是如何设计一个演算法A,来选择一个最好的直线,能将平面上所有的正类和负类完全分开,也就是找到最好的g,g≈fg≈f。 如何找到这样一条最好的直线呢?我们可以使用逐点修正的思想,首先在平面上随意取一条直线,看看哪些点分类错误。然后开始对第一个错误点就行修正,即变换直线的位置,使这个错误点变成分类正确的点。接着,再对第二个、第三个等所有的错误分类点就行直线纠正,直到所有的点都完全分类正确了,就得到了最好的直线。这种“逐步修正”,就是PLA思想所在。
下面介绍一下PLA是怎么做的。首先随机选择一条直线进行分类。然后找到第一个分类错误的点,如果这个点表示正类,被误分为负类,即那表示w和x夹角大于90度,其中w是直线的法向量。所以,x被误分在直线的下侧(相对于法向量,法向量的方向即为正类所在的一侧),修正的方法就是使w和x夹角小于90度。通常做法是w←w+yx, y=1w←w+yx, y=1,如图所示,一次或多次更新后的w+yx与x夹角小于90度,能保证x位于直线的上侧,则对误分为负类的错误点完成了直线修正。 同理,如果是误分为正类的点,即wT*xn(t)>0,那表示w和x夹角小于90度,其中w是直线的法向量。所以,x被误分在直线的上侧,修正的方法就是使w和x夹角大于90度。通常做法是">w←w+yx, y=−1w←w+yx, y=−1,一次或多次更新后的w+yx夹角大于90度,能保证x位于直线的下侧,则对误分为正类的错误点也完成了直线修正。 按照这种思想,遇到个错误点就进行修正,不断迭代。要注意一点:每次修正直线,可能使之前分类正确的点变成错误点,这是可能发生的。但是没关系,不断迭代,不断修正,最终会将所有点完全正确分类(PLA前提是线性可分的)。这种做法的思想是“知错能改”。 实际操作中,可以一个点一个点地遍历,发现分类错误的点就进行修正,直到所有点全部分类正确。这种被称为Cyclic PLA。 PLA算法修正图解和Guarantee of PLA证明见附件。 总结:感知器算法具有实现简单,操作快,可以在任何维度实现的优点,但是必须假设数据是线性可分,不确定运算时间。主要用于二元分类问题。对于非线性可分问题可以将PLA进行改进,改为Packet Algorithm。具体见附件。
|