文章目录
一、支持向量机理论简介
支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面
1.线性分类
线性可分性
在分类问题中给定输入数据和学习目标:X={X1,X2,…,XN},y={y1,…,yN},其中输入数据的每个样本都包含多个特征并由此构成特征空间:X=[x1,x2,…,xn],而学习目标为二元变量

表示负类和正类
若输入数据所在的特征空间存在作为决策边界的超平面将学习目标按正类和负类分开,并使任意样本的点到平面距离大于等于1

则称该分类问题具有线性可分性,参数w,b分别为超平面的法向量和截距。
满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:

所有在上间隔边界上方的样本属于正类,在下间隔边界下方的样本属于负类。两个间隔边界的距离d=2/||w||被定义为边距(margin),位于间隔边界上的正类和负类样本为支持向量。

2.核方法
一些线性不可分的问题可能是非线性可分的,即特征空间存在超曲面将正类和负类分开。使用非线性函数可以将非线性可分问题从原始的特征空间映射至更高维的希尔伯特空间,从而转化为线性可分问题,此时作为决策边界的超平面表示如下:


由于映射函数具有复杂的形式,难以计算其内积,因此可使用核方法,即定义映射函数的内积为核函数:

以回避内积的显式计算
Mercer定理
核函数的选择需要一定条件,函数

是核函数的充要条件是,对输入空间的任意向量:

其核矩阵,即如下形式的格拉姆矩阵

是半正定矩阵。上述结论被称为Mercer定理
作为充分条件:特征空间内两个函数的内积是一个二元函数,在其核矩阵为半正定矩阵时,该二元函数具有可再生性:

因此其内积空间是一个赋范向量空间,可以完备化得到希尔伯特空间 ,即再生核希尔伯特空间。作为必要条件,对核函数构造核矩阵后易知:

常见的核函数

3.算法
线性SVM
(1)硬边距
给定输入数据和学习目标:X={X1,X2,…,XN},y={y1,…,yN},硬边界SVM是在线性可分问题中求解最大边距超平面的算法,约束条件是样本点到决策边界的距离大于等于1。硬边界SVM可以转化为一个等价的二次凸优化问题进行求解:

由上式得到的决策边界可以对任意样本进行分类:

我们注意到虽然超平面法向量w是唯一优化目标,但学习数据和超平面的截距通过约束条件影响了该优化问题的求解。硬边距SVM是正则化系数取0时的软边距SVM,下面我们来看一看软边距SVM。
(2)软边距
在线性不可分问题中使用硬边距SVM将产生分类误差,因此可在最大化边距的基础上引入损失函数构造新的优化问题。SVM使用铰链损失函数,沿用硬边界SVM的优化问题形式,软边距SVM的优化问题有如下表示:

上式表明可知,软边距SVM是一个L2正则化分类器,式中Li表示铰链损失函数。使用松弛变量:ξ≥0处理铰链损失函数的分段取值后,上式可化为:

求解上述软边距SVM通常利用其优化问题的对偶性
推导:
定义软边距SVM的优化问题为原问题,通过拉格朗日乘子:
可得到其拉格朗日函数:

令拉格朗日函数对优化目标w,b,ξ的偏导数为0,可得到一系列包含拉格朗日乘子的表达式:

将其带入拉格朗日函数后可得原问题的对偶问题:

对偶问题的约束条件中包含不等关系,因此其存在局部最优的条件是拉格朗日乘子满足条件:

由上述KKT条件可知,对任意样本(Xi,yi),总有αi=0或yi(w^TXi+b)=1-ξi ,对前者,该样本不会对决策边界wTXi+b=0产生影响,对后者,该样本满足yi(wTXi+b)=1-ξi意味其处于间隔边界上(αi< C)、间隔内部(αi=C)或被错误分类(αi>C),即该样本是支持向量。由此可见,软边距SVM决策边界的确定仅与支持向量有关,使用铰链损失函数使得SVM具有稀疏性
非线性SVM
使用非线性函数将输入数据映射至高维空间后应用线性SVM可得到非线性SVM。非线性SVM有如下优化问题:

类比软边距SVM,非线性SVM有如下对偶问题:

注意到式中存在映射函数内积,因此可以使用核方法,即直接选取核函数:
非线性SVM的对偶问题的KKT条件可同样类比软边距线性SVM。
二、代码实现
未经标准化的原始数据点分布
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X = iris.data
y = iris.target
# X = X[y<2,:2] #只取y<2的类别,也就是0 1 并且只取前两个特征 y = y[y<</span>2]
plt.scatter(X[y==0,0],X[y==0,1],color='red')
plt.scatter(X[y==1,0],X[y==1,1],color='blue')
plt.show()
# 标准化
standardScaler = StandardScaler()
standardScaler.fit(X) #计算训练数据的均值和方差
X_standard = standardScaler.transform(X) #再用scaler中的均值和方差来转换X,使X标准化
svc = LinearSVC(C=1e9) #线性SVM分类器
svc.fit(X_standard,y) # 训练svm


from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
def PolynomialSVC(degree,C=1.0):
return Pipeline([ ("poly",PolynomialFeatures(degree=degree)),#生成多项式
("std_scaler",StandardScaler()),#标准化
("linearSVC",LinearSVC(C=C))#最后生成svm
])
from matplotlib.colors import ListedColormap
def plot_decision_boundary(model, axis)

本文深入探讨了支持向量机(SVM)的理论基础,包括线性分类、核方法及算法实现,详细解释了硬边距与软边距的概念,同时介绍了如何使用核函数处理非线性可分问题。此外,还提供了SVM在Python中的代码实现示例,展示了如何通过多项式特征和核函数提升数据维度,以及如何调整超参数。
最低0.47元/天 解锁文章
1373

被折叠的 条评论
为什么被折叠?



