感知机算法(Perceptron Learning Algorithm)

Python015

感知机算法(Perceptron Learning Algorithm),第1张

感知机(perceptron)是二类分类的线性分类模型,它的思想很简单,就是在一个二维空间中寻找一条直线将红点和蓝点分开(图1),类比到高维空间中,感知机模型尝试寻找一个超平面,将所有二元类别分开(图2)。

如果我们找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分(图3),也就意味着感知机模型不适合你的数据的分类。使用感知机一个最大的前提,就是数据是线性可分的。

如果我们有n个样本,每个样本有m维特征和一个二元输出类别:

感知机的目标是找到一个超平面:

让其中一个类别的样本满足 ,而另一类样本满足

,从而样本线性可分。但这样的超平面并不是唯一的,感知机模型采取不同的初始值( )解可能会不同。

我们用相量方式对上式进行表达: ,由此感知机的模型可以定义为:

,其中:

例如:将一个新的样本 带入训练好的模型 ,当   ,  被分为 类。当  ,  被分为 类。

我们将满足 的样本类别输出值取 ,满足 的样本类别输出值取 。从而正确分类的样本满足 ,而错误分类的样本满足 。损失函数的优化目标是使所有被错误分类的样本到超平面的距离之和最小。

一个被错误分类的样本 , ,到超平面的距离是 ,

其中    。 为超平面的法向量, 的大小变化并不会影响样本点到超平面的距离。我们令 ,并且假设所有错误分类的点的集合为M,则所有错误分类的样本到超平面的距离之和为:

最终构建的损失函数为:

感知机模型选择的是采用随机梯度下降,这意味着我们每次仅仅需要使用一个误分类的点来更新梯度。损失函数 的梯度如下:

随机选取一个错误分类点 ,对 进行更新:

式中 为初始值, 是步长(learning rate)。通过这样迭代可以使损失函数 不断减小,直到为0。

感知机模型的优化方法可以通俗的解释为:当一个样本被错误分类,即位于分类超平面的错误一侧时,则调整 的值,使分类超平面向该错误分类点的一侧移动,以减少该错误分类点与超平面间的距离,直至超平面越过该错误分类点,最终被正确分类。

上一节的感知机模型的算法形式我们一般称为感知机模型的算法原始形式。对偶形式是对算法执行速度的优化。对偶形式的基本想法是将 表示为样本 和标签 的线性组合,通过求解其系数而求得 。我们取初始值 为 ,选取错误分类样本 对 进行更新有:

假设为了将样本 正确分类而更新 的次数为 ,每一个样本 的 的初始值为 ,每当次样本在某一次梯度下降迭代中因误分类而更新时, 的值 ,则 关于 的增量分别为 和 。则用所有样本对 进行更新,最后得到的 可以表示为

的通俗解释:如果 的值越大,那么意味着样本 经常被误分。很明显离超平面很近的点,当超平面稍微移动一点点, 的类别就发生变化。

我们用 的等价形式  来判断错误分类。上式中 表示的是两个样本的内积,而且这个内积的结果在更新 的过程中会多次使用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时, 仅仅一次的矩阵内积运算比多次的循环计算省时。 计算量最大的判断误分类这儿就省下了很多的时间,这也是对偶形式的感知机模型比原始形式优的原因。

样本的内积矩阵称为Gram矩阵,它是一个对称矩阵,记为

例如: , , 则Gram矩阵为

                  

   G=      =   

                    

以上为建立感知机模型的相关理论知识,如果有需要用python建立感知机模型进行分类的小伙伴的可以上访问我的github:

https://github.com/Rocky1ee/Perceptron-Model

小伙伴们如果觉得文章还行的请点个赞呦!!同时觉得文章哪里有问题的可以评论一下  谢谢你!

笔者比较懒能截图的地方都截图了。

支持向量机分为三类:

(1)线性可分支持向量机,样本线性可分,可通过硬间隔最大化训练一个分类器。

(2)线性支持向量机,样本基本线性可分,可通过软间隔最大化训练一个分类器。

(3)非线性支持向量机,样本线性不可分,可通过核函数和软间隔最大化训练一个分类器。

上面最不好理解的恐怕就是硬间隔和软间隔了,

说白了硬间隔就是说存在这么一个平面,可以把样本完全正确无误的分开,当然这是一种极理想的情况,现实中不存在,所以就有了软间隔。

软间隔说的是,不存在一个平面可以把样本完全正确无误的分开,因此呢允许一些样本被分错,怎么做呢就是加入松弛变量,因为希望分错的样本越小越好,因此松弛变量也有约束条件。加入松弛变量后,问题就变为线性可分了,因为是每一个样本都线性可分,因此松弛变量是针对样本的,每一个样本都对应一个不同的松弛变量。

其实感知机说白了就是找到一条直线把样本点分开,就是上方都是一类,下方是另一类。当然完全分开是好事,往往是不能完全分开的,因此就存在一个损失函数,就是误分类点到这个平面的距离最短:

这里啰嗦一句,误分类点y*(wx+b)<0,所以加个负号在前边。

一般情况下||w||都是可以缩放,那么我们把它缩放到1,最后的目标函数就变成了

间隔就是距离,我们假设分离超平面为 ,那么样本点到这个平面的距离可以记为 。我们都知道通过感知机划分的点,超平面上方的点 ,下方的点 ,然后通过判断 的值与y的符号是否一致来判断分类是否正确。根据这个思路函数间隔定义为:

支持向量的定义来源于几何间隔,几何间隔最直接的解释是离分隔超平面最近点的距离,其他任何点到平面的距离都大于这个值,所以几何间隔就是支持向量。然后呢同样道理,w和b是可以缩放的,所以定义支持向量满足如下条件:

再通俗一点说,支持向量是一些点,这些点到分隔平面的距离最近,为了便于表示,把他们进行一下缩放计算,让他们满足了wx+b=+-1.

核函数是支持向量机的核心概念之一,它存在的目的就是将维度转换之后的计算简化,达到减少计算量的目的。我们都知道支持向量机求的是间距最大化,通常情况下我们求得的alpha都等于0,因此支持向量决定了间距最大化程度。

核函数的形式是这样的

其中x(i)和x(j)都是向量,他们两个相乘就是向量内积,相乘得到一个数。刚才说了目标函数一般只和支持向量有关,因此在做核函数计算之前,实际就是选择的支持向量进行计算。

这个写完下面得再补充

我们知道了支持向量的概念,那么支持向量机的目标函数是要使这两个支持向量之间的距离尽可能的远,因为这样才能更好地把样本点分开,当然支持向量也要满足最基本的约束条件,那就是分类正确,还有就是其他点到分隔平面的距离要大于等于支持向量到分隔平面的距离。

这种凸优化问题都可以通过拉格朗日算子进行优化,就是把约束条件通过拉格朗日系数放到目标函数上。这部分基础知识,就是拉格朗日算法可以将等式约束和不等式约束都加到目标函数上,完成求解问题的转换,但是要满足一些约束条件,也就是我们后边要说的kkt条件。

这里有个细节就是转换时候的加减号问题,这个和目标函数还有约束的正负号有关。一般这么理解,就是求最小化问题时候,如果约束是大于0的,那么拉个朗日算子可以减到这一部分,这样一来目标函数只能越来越小,最优解就是约束为0的时候,这个时候和没有约束的等价,再求最小就是原问题了。

这里是最小化问题,直接减掉这部分约束,然后后半部分永远大于等于0所以这个式子的值是要小于原来目标函数值的。我们知道当x满足原问题的约束条件的时候,最大化L就等于那个原目标函数。所以我们可以把这个问题转化为:

把它带回去原来的目标函数中,整理一下。

这个时候只要求最优的α,就可以求出w和b了。我们上边做了那么一堆转换,这个过程要满足一个叫做kkt条件的东西,其实这个东西就是把一堆约束条件整理到一起。

(1)原有问题的可行性,即h(x )=0,g(x )<0

放到这里就是:

SMO算法的核心思想是求出最优化的α,然后根据之前推导得到的w,b,α之间的关系计算得到w和b,最后的计算公式是:

现在的问题就是怎么求α了。

SMO算法总共分两部分,一部分是求解两个α的二次规划算法,另一部分是选择两个α的启发式算法。

先说这个选择α的启发式算法部分:大神可以证明优先优化违反kkt条件的α可以最快获得最优解,至于咋证明的,就先不看了。

在讲支持向量机的求解算法时候,直接给出了核函数K,那么怎么去理解核函数呢。核函数的作用是解决样本点在高维空间的内积运算问题,怎么理解呢,通常的分类问题都是有很多个特征的,然后为了达到现线性可分,又会从低维映射到高维,样本量再一多计算量非常大,因此先通过函数进行一个转换,减少乘法的计算量。

要理解核函数,先理解内积运算,内积运算实际是两个向量,对应位置相乘加和,比如我有x1 = [v1,v2], x2=[w1,w2],那么x1和x2的内积计算方法就是:v1w1+v2w2。

如果上面那种情况线性不可分,需要到高维进行映射,让数据变得线性可分,然后数据变为五维的,即v1 2+v2 2+v1+v2+v1v2,然后再进行一次内积计算,数据变为 。

稍作变换,可以变为 ,形式展开和上边那个长式子差不多,然后其实可以映射内积相乘的情况,所以可以进行核函数的变化。

问题在于,当你需要显式的写出来映射形式的时候,在维度很高的时候,需要计算的量太大,比如x1有三个维度,再进行映射就有19维度了,计算很复杂。如果用核函数,还是在原来低维度进行运算,既有相似的效果(映射到高维),又低运算量,这就是核函数的作用了。

核函数的种类:

这部分的核心在于SMO算法的编写。有待补充。