Python向量函数表示的简单介绍( 二 )


线性可分的所对应的函数间隔满足的条件,故就等于。所以,可以将目标函数等价为如下的表达式:
假设存在一个需要最小化的目标函数,并且该目标函数同时受到的约束 。如需得到最优化的解,则需要利用拉格朗日对偶性将原始的最优化问题转换为对偶问题,即:
分割面的求解
分割面的表达式
对于非线性SVM模型而言,需要经过两个步骤,一个是将原始空间中的样本点映射到高维的新空间中,另一个是在新空间中寻找一个用于识别各类别样本点线性“超平面” 。
假设原始空间中的样本点为,将样本通过某种转换映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
其中,内积可以利用核函数替换,即。对于上式而言,同样需要计算最优的拉格朗日乘积,进而可以得到线性“超平面”与的值:
假设原始空间中的两个样本点为,在其扩展到高维空间后 , 它们的内积如果等于样本点在原始空间中某个函数的输出,那么该函数就称为核函数 。
线性核函数的表达式为,故对应的分割“超平面”为:
多项式核函数的表达式为,故对应的分割“超平面”为:
高斯核函数的表达式为,故对应的分割“超平面”为:
Sigmoid 核函数的表达式为,故对应的分割“超平面”为:
在实际应用中,SVM 模型对核函数的选择是非常敏感的,所以需要通过先验的领域知识或者交叉验证的方法选出合理的核函数 。大多数情况下,选择高斯核函数是一种相对偷懒而有效的方法,因为高斯核是一种指数函数,它的泰勒展开式可以是无穷维的 , 即相当于把原始样本点映射到高维空间中 。
output_13_0.png
如何用Python实现支持向量机终于到SVM的实现部分了 。那么神奇和有效的东西还得回归到实现才可以展示其强大的功力 。SVM有效而且存在很高效的训练算法,这也是工业界非常青睐SVM的原因 。
前面讲到,SVM的学习问题可以转化为下面的对偶问题:
需要满足的KKT条件:
也就是说找到一组αi可以满足上面的这些条件的就是该目标的一个最优解 。所以我们的优化目标是找到一组最优的αi* 。一旦求出这些αi*,就很容易计算出权重向量w*和b,并得到分隔超平面了 。
这是个凸二次规划问题,它具有全局最优解,一般可以通过现有的工具来优化 。但当训练样本非常多的时候,这些优化算法往往非常耗时低效,以致无法使用 。从SVM提出到现在,也出现了很多优化训练的方法 。其中,非常出名的一个是1982年由Microsoft Research的John C. Platt在论文《Sequential Minimal Optimization: A Fast Algorithm for TrainingSupport Vector Machines》中提出的Sequential Minimal Optimization序列最小化优化算法,简称SMO算法 。SMO算法的思想很简单,它将大优化的问题分解成多个小优化的问题 。这些小问题往往比较容易求解,并且对他们进行顺序求解的结果与将他们作为整体来求解的结果完全一致 。在结果完全一致的同时,SMO的求解时间短很多 。在深入SMO算法之前,我们先来了解下坐标下降这个算法,SMO其实基于这种简单的思想的 。
8.1、坐标下降(上升)法
假设要求解下面的优化问题:
在这里,我们需要求解m个变量αi,一般来说是通过梯度下降(这里是求最大值,所以应该叫上升)等算法每一次迭代对所有m个变量αi也就是α向量进行一次性优化 。通过误差每次迭代调整α向量中每个元素的值 。而坐标上升法(坐标上升与坐标下降可以看做是一对,坐标上升是用来求解max最优化问题 , 坐标下降用于求min最优化问题)的思想是每次迭代只调整一个变量αi的值,其他变量的值在这次迭代中固定不变 。

推荐阅读