本人的博客写作目的只是为了编程实现,因此更注重算法逻辑和细节,如果对原理感兴趣,推荐看“西瓜书”和“花书”以及以下链接,但不保证链接中的公式都正确:
https://www.cnblogs.com/Belter/p/8975606.html
https://blog.csdn.net/qq_35992440/article/details/80987664
支持向量机可以分为硬间隔支持向量机和软间隔支持向量机,硬间隔不允许任何向量落入间隔之中,软间隔允许向量落入,甚至允许有错分的情况,可想而知,硬间隔只有在线性可分的情况下才能奏效、易受噪声干扰且泛化能力不如软间隔,所以一般使用软间隔。硬间隔分类目标(下式需要min):
附带条件:
以上为分类器的目标和附带的条件,需要最小化损失函数的同时满足附带条件。其中 在样本为负类时等于-1,正类则为1,w为权值向量,b为截距(注意上面在讲其他线性回归时是将截距作为特征放在权重向量和样本向量集中的)。
软间隔分类目标:
附带条件:
其中
这里只讨论怎么解硬间隔分类(查到软间隔怎么解再补充),硬间隔分类是一个凸二次规划问题(convex quadratic programming)(软间隔也属于这类问题)。针对约束优化问题,常常可以把它转换为对偶问题(dual problem)来解决,通常来说,对偶问题算是约束优化问题退而求其次的解法,但某些情况下,两种方法也可以得到相同的解,支持向量机刚好就可以完美地用对偶得到相同地解。根据广义拉格朗日乘法,硬间隔分类可以转换为如下形式:
其中
拉格朗日证明,约束优化问题地解在拉格朗日稳定点(w,b,a偏导数都为0的点)之间,对于以上乘法,由于稳定点唯一,所以约束优化问题的解就是该稳定点,因此:
分别令 、
的偏导为0,得:
注意这里得 是指的令
时,w的取值,以下
的含义相同。将式
带回广义拉格朗日乘法得(下式需要max):
附带条件:
其中
注意 和
均为单个数字,而
为向量。现在需要找到令
最大的a的取值,注意这里的取值是一个集合,有m个,可以称其为向量
,以上问题是一个凸二次规划问题,同时需要满足KKT条件(Karush-Kuhn-Tucker),因训练样本规模提升的情况下,通用二次规划复杂度过高,因此可以使用其他改良的优化算法解,如SMO(Sequential Minimal Optimization)(了解凸二次规划问题后再补充)。
在解出向量a后,带回 求得
,再通过下式解截距:
注意这个式子中的样本都是支持向量。
支持向量机的核函数:核函数其实就和多项式回归类似,通过不同的方法,将维度增多,使得数据变成高维线性可分的,可想而知,应注意过拟合的问题,以下为一个简单的例子-二阶多项式核变换,注意以下x代表一个样本点向量, 代表的是该样本点的维度而非样本点号:
假设原式只有两个维度,经过二阶多项式变换就有三个维度了(注意,原维度应抛弃不要了),之后得到的三个维度应中心化并归一化(与线性核多样操作)。接下来讲一讲在支持向量机中,也就是这个公式 中魔法般的核技巧,还是先用二阶多项式举例,注意以下a、b代表不同的样本点:
而在 中刚好就有
的计算(原式为
,加入核变化之后就会变成
),所以这一部分计算可以直接转化为
,这样的好处在于不用事先展开
为更高维度的数据,再与另一个展开的
做运算(这样的矩阵运算在原本就是高维的情况下大的可怕,想象一下10w*10w的向量有多大),运算速度得到了飞升。该核技巧实际是一种被称为“Mercer定理”的变换技巧,凡是符合该定律的函数都可以作为核,常用的核有,线性核:
、
同上,表示两个不同的样本点,线性核和原
中的形式一样,在不用核的情况下默认就是线性核。融入核变换的多项式核:
、
、
都是超参数。以下是高斯RBF核(径向基)原本的形式:
下面的式子是简写的形式, 被称为地标,地标必须建立在样本点上(也就是将原有的一些样本点设置为地标),
是以地标为中心创造的一个钟型凸函数,其中
是超参数(在sklearn中为gamma),它影响钟型的宽度,增加
钟变窄,同时它影响拟合函数的形状,如果发生过拟合,应减小
,欠拟合应增大。这个函数的每一个原样本与一个地标进行一次核变换将为该样本创建一个维度的数据,也就是说有多少个地标就创建了多少个新的维度(注意原维度同上,应被抛弃),通常情况下,我们处理的方法是在每个样本点上创建一个地标,这样原本为m*n(m为样本数量,n为维度数量)的数据将变为m*m,任何数据都将变得线性可分,但缺点也显而易见,如果m太大,新的样本空间也会巨大。融入核变换的高斯RBF核:
融入核变换的Sigmoid核:
同上 、
都是超参数。
在实际使用中,线性核表现一般都会很好,且速度上占绝对的优势,凡训练SVM,都应从线性核开始,多项式核的超参数(幂次方)应该用网格搜索找到合适的值,RBF同理,在样本数量小的情况下可以尝试用RBF。