SVM 擅长解决复杂的中小规模的非线性问题,甚至在特征多余训练样本时也能有非常好的表现。
但是随着样本量的增加,SVM模型的计算复杂度会呈m^2
或m^3增加。
SVM 算法涉及到非常多的概念:间隔、支持向量、核函数、对偶、凸优化等。
在两类样本线性可分的情况下,感知机可以保证找到一个解,完全正确的区分这两类样本。但是解不唯一,(如图2)而且这些决策边界的质量也不相同,直观上来看这条线两边的间隔越大越好。那么有没有一种方法可以直接找到这个最优解呢?
这个就要找支持向量机了。从直观上来看,约束条件越多对模型的限制也就越大,因此解的个数也就越少。感知机的解不唯一,那么给感知机的代价函数加上更强的约束条件好像就可以减少解的个数。事实上也是这样的。
支持向量机的代价函数:
在分类正确时,即y(w⋅x+b)>1,loss=0;
在分类错误时,即y(w⋅x+b)≤1,loss=−y(w⋅x+b).
比较一下可以发现,原来w⋅x+b只需要大于0或小于0就可以了,但是现在需要大于1或小于1. 在这里为什么选择1我还没有很直观的解释,但是有一点非常重要:原来的决策边界只是一条直线,现在则变成了一条有宽度的条带。原来差异非常小的两个点(例如w⋅x+b=0附近的两个点)就可以被分成不同的两类,但是现在至少要相差 2/||w|| 才可以,如下图所示。
图3:设样本属于两个类,用该样本训练SVM得到的最大间隔超平面。在超平面上的样本点也称为支持向量。
为了统一起见,下面还是将决策边界定义为w⋅x+b=0,两边的边界(两条虚线)分别为w⋅x+b=1和w⋅x+b=−1,此时只是b的符号不同其他性质都相同. 其中w,b就是模型训练时需要优化的参数。由上面的示意图可以得到以下信息:
1)两条虚线之间的距离为2||w||;
2)待优化参数w的方向就是决策边界的法向量方向(w与决策边界垂直);
3)此时边界上一共有3个点,这三个点也就是此时的支持向量。
计算两条虚线之间的距离可得:
对于直线w⋅x+b=1来说,截距式为x2=−w1/w2∗x1+(1−b)/w2,相当于沿着x2轴向上平移了1w2,计算可得该直线与w⋅x+b=0沿法向量方向的距离为
Γ=(1/(w12+w22))1/2=1/||w||,,参考图4.
图4 margin的宽度γ
优化目标:
SVM的优化目标就是最大化margin的宽度为γ,因为γ=1/||w||,
其中||w||是待优化参数w的模长。因此优化目标等价于最小化||w||,可以表示为为:
对于(x(1),y(1)), …, (x(m),y(m))∈Rd×{−1,1},minw∈Rd,b∈R||w||2
s.t. y(i)(w⋅x(i)+b)≥1对于所有的i=1,2,…,m成立。
下面是分别使用感知机和SVM对鸢尾属数据集中setosa这一类和非setosa进行分类的效果比较:
图5:感知线性分类器
图6 线性SVM分类结果
比较图5和图6可以看到,SVM确定的决策边界周围的margin更大一些,因此对更多未知的样本进行分类时,在边界上的一些点可以得到更准确的分类结果。
线性不可分:
在上图中,setosa这一类与其他两类是线性可分的,但是virginica这一类与与之相邻的versicolor有一些点是重合的,也就是说是线性不可分的。此时仍然可以使用SVM来进行分类,原理是在代价函数中加入了一个松弛变量(slack) ξ,
对于(x(1),y(1)), …, (x(m),y(m))∈Rd×{−1,1},minw∈Rd,b∈R||w||2+C∑mi=1ξi
s.t. y(i)(w⋅x(i)+b)≥1−ξi对于所有的i=1,2,…,m成立
上面的优化目标加入松弛变量后,就可以允许一定程度的违反两边的边界(由上式中的C来控制),允许一定的错误分类,从而将两类原来线性不可分的两类数据分开。
下面是C=1000时,对virginica和非virginica的分类效果:
图8 加入松弛变量后的SVM分类效果
支持向量回归模型(Support Vector Regression, SVR)是使用SVM来拟合曲线,做回归分析。分类和回归问题是有监督机器学习中最重要的两类任务。与分类的输出是有限个离散的值不同的是,回归模型的输出在一定范围内是连续的。
在SVM分类模型中,我们的目标函数是让权值的二范数最小,同时让各个训练集中的点尽量远离自己类别一边的支持向量。
回归模型中,目标是让训练集中的每个点(xi,yi)尽量拟合到一个线性模型yi=wφ(xi)+ b。
对于一般的回归模型,我们是用均方差作为损失函数,但是SVR不是这样定义损失函数的。
SVR需要我们顶一个常量 ε>0,对于每一个点(xi,yi),如果
|yi-wφ(xi)- b| ≤ ε ,则对应的损失为
yi-wφ(xi)- b - ε,这个均方差损失函数不同,如果是均方差,那么只要 yi-wφ(xi)- b≠0 ,就会有损失。
如下图所示,在蓝色条带里面的点都是没有损失的,但是外面的点是有损失的,损失大小为红色线的长度。
因此,SVR的损失函数度量为:
SVR目标函数的原始形式
我们可以先求优化函数对于w,b,ξi∨,ξi∧的极小值, 接着再求拉格朗日乘子α∨,α∧,μ∨,μ∧的极大值。
求解后得到对应目标函数如下:
SVM算法是一个很优秀的算法,在集成学习和神经网络之类的算法没有表现出优越性能前,SVM基本占据了分类模型的统治地位。目前则是在大数据时代的大样本背景下,SVM由于其在大样本时超级大的计算量,热度有所下降,但是仍然是一个常用的机器学习算法。
优点
2) 仅仅使用一部分支持向量来做超平面的决策,无需依赖全部数据。
3) 有大量的核函数可以使用,从而可以很灵活的来解决各种非线性的分类回归问题。
不足
如果特征维度远远大于样本数,则SVM表现一般。
SVM在样本量非常大,核函数映射维度非常高时,计算量过大,不太适合使用。
3)非线性问题的核函数的选择没有通用标准,难以选择一个合适的核函数。
4)SVM对缺失数据敏感。
参考:
链接1:https://www.cnblogs.com/Belter/p/8975606.html
链接2:https://www.cnblogs.com/pinard/p/6113120.html
链接3:https://cloud.tencent.com/developer/article/1085058?from=article.detail.1084628