使用Python从零实现多分类SVM

本文将首先简要概述支持向量机及其训练和推理方程 , 然后将其转换为代码以开发支持向量机模型 。之后然后将其扩展成多分类的场景 , 并通过使用Sci-kit Learn测试我们的模型来结束 。
SVM概述支持向量机的目标是拟合获得最大边缘的超平面(两个类中最近点的距离) 。可以直观地表明,这样的超平面(A)比没有最大化边际的超平面(B)具有更好的泛化特性和对噪声的鲁棒性 。

使用Python从零实现多分类SVM

文章插图
为了实现这一点 , SVM通过求解以下优化问题找到超平面的W和b:
使用Python从零实现多分类SVM

文章插图
它试图找到W,b,使最近点的距离最大化,并正确分类所有内容(如y取±1的约束) 。这可以被证明相当于以下优化问题:
使用Python从零实现多分类SVM

文章插图
可以写出等价的对偶优化问题
使用Python从零实现多分类SVM

文章插图
这个问题的解决方案产生了一个拉格朗日乘数,我们假设数据集中的每个点的大小为m:(α 1 ,  α 2,…,α _n) 。目标函数在α中明显是二次的,约束是线性的,这意味着它可以很容易地用二次规划求解 。一旦找到解,由对偶的推导可知:
使用Python从零实现多分类SVM

文章插图
注意,只有具有α>0的点才定义超平面(对和有贡献) 。这些被称为支持向量 。因此当给定一个新例子x时 , 返回其预测y=±1的预测方程为:
使用Python从零实现多分类SVM

文章插图
这种支持向量机的基本形式被称为硬边界支持向量机(hard margin SVM),因为它解决的优化问题(如上所述)强制要求训练中的所有点必须被正确分类 。但在实际场景中,可能存在一些噪声,阻止或限制了完美分离数据的超平面,在这种情况下,优化问题将不返回或返回一个糟糕的解决方案 。
使用Python从零实现多分类SVM

文章插图
软边界支持向量机(soft margin SVM)通过引入C常数(用户给定的超参数)来适应优化问题 , 该常数控制它应该有多“硬” 。特别地 , 它将原优化问题修改为:
使用Python从零实现多分类SVM

文章插图
它允许每个点产生一些错误λ(例如,在超平面的错误一侧),并且通过将它们在目标函数中的总和加权C来减少它们 。当C趋于无穷时(一般情况下肯定不会),它就等于硬边界 。与此同时,较小的C将允许更多的“违规行为”(以换取更大的支持;例如,更小的w (w) 。
可以证明,等价对偶问题只有在约束每个点的α≤C时才会发生变化 。
使用Python从零实现多分类SVM

文章插图
由于允许违例,支持向量(带有α>0的点)不再都在边界的边缘 。任何错误的支持向量都具有α=C,而非支持向量(α=0)不能发生错误 。我们称潜在错误(α=C)的支持向量为“非错误编剧支持向量”和其他纯粹的支持向量(没有违规;“边界支持向量”(0<α<C) 。
这样推理方程不变:
【使用Python从零实现多分类SVM】
使用Python从零实现多分类SVM

文章插图
现在(x?,y?)必须是一个没有违规的支持向量,因为方程假设它在边界的边缘 。
软边界支持向量机扩展了硬边界支持向量机来处理噪声,但通常由于噪声以外的因素,例如自然非线性,数据不能被超平面分离 。软边界支持向量机可以用于这样的情况,但是最优解决方案的超平面,它允许的误差远远超过现实中可以容忍的误差 。
使用Python从零实现多分类SVM

文章插图
例如,在左边的例子中,无论C的设置如何,软边界支持向量机都找不到线性超平面 。但是可以通过某种转换函数z=Φ(x)将数据集中的每个点x映射到更高的维度,从而使数据在新的高维空间中更加线性(或完全线性) 。这相当于用z替换x得到:
使用Python从零实现多分类SVM

文章插图
在现实中,特别是当Φ转换为非常高维的空间时,计算z可能需要很长时间 。所以就出现了核函数 。它用一个数学函数(称为核函数)的等效计算来取代z,并且更快(例如,对z进行代数简化) 。例如,这里有一些流行的核函数(每个都对应于一些转换Φ到更高维度空间):


推荐阅读