支持向量机 Support Vector Machine 简称 SVM ,是一种最大化间隔的分类算法。最大化间隔的意思说白了就是,找到最大的间隔。(我就觉得奇怪,SVM 是一种算法,也就是一套方法,但 “SVM” 这名字取得好像它是一种装置一样…)
支持向量机解决的是分类问题。(SVM 是否可用于解决其他类型的问题,比如回归?)
分类问题可分为线性可分问题和非线性可分问题。首先讨论线性可分问题。
线性可分问题也就是(在二维情况下)可以通过一条直线将数据集中的样本点分为两类的问题。这里的直线,我们称之为线性模型。
对于二维空间来说,线性模型就是直线;对于三维空间来说,是平面;对于三维以上的空间来说,是超平面。线性模型的数学式为 w T x + b = 0 w^Tx+b=0 wTx+b=0 。
如下图,就是一个线性可分的分类问题:
对于上图这个数据集,我们可以找到无数条直线来将圈和叉分开。支持向量机所要做的,就是找到一条直线,即下图黑线,这条直线与其他可将圈叉分开的直线相比,所对应的 margin 间隔最大: 将黑线向上向下平移。向上平移直到接触到离黑线最近的圈;向下平移,直到接触到最近的叉。这里离黑线最近的圈和叉就称为支持向量 support vector。由此我们可以得到两条蓝线,蓝线与黑线之间的距离就是间隔。
那么 SVM 是如何找到对应最大间隔的那条直线的呢?
我们需要想办法将间隔用数学式子表示出来。向量 x x x 到超平面的距离公式为 d = ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ d=\frac{|w^Tx+b|}{||w||} d=∣∣w∣∣∣wTx+b∣ 那么对于某个向量 x 0 x_0 x0 有, d = ∣ w T x 0 + b ∣ ∣ ∣ w ∣ ∣ d=\frac{|w^Tx_0+b|}{||w||} d=∣∣w∣∣∣wTx0+b∣,由于 w w w 和 b b b 的值在模型的训练开始前会被随机给出,所以 ∣ w T x 0 + b ∣ |w^Tx_0+b| ∣wTx0+b∣ 的值其实是确定的,假设这个值是 M M M,那么我们可以通过缩放,将 M M M 变为 1 1 1。也就是说,经过缩放, ∣ w T x 0 + b ∣ |w^Tx_0+b| ∣wTx0+b∣ 转化为了 1 1 1,则可以得到 d = 1 ∣ ∣ w ∣ ∣ d=\frac{1}{||w||} d=∣∣w∣∣1。
我们的目标是找到最大的间隔,也就是使 d d d 的值最大化,等价于使得 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ 的值最小化。为了方便后面的计算,我们将使 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ 最小化,变为使 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21∣∣w∣∣2 最小化。
对于 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21∣∣w∣∣2,之所以要加个平方,是为了将向量 w 的模中的根号去掉,方便运算。之所以前面要乘个 1 2 \frac{1}{2} 21 为了方便求导( ∣ ∣ w ∣ ∣ 2 ||w||^2 ∣∣w∣∣2 求导后为 2 ∣ ∣ w ∣ ∣ 2||w|| 2∣∣w∣∣,乘 1 2 \frac{1}{2} 21 可以将 2 2 2 约掉。)