图像处理|支持向量机SVM

支持向量机
理解 SVM
目标
? 对 SVM 有一个直观理解
原理
线性数据分割
如下图所示,其中含有两类数据,红的和蓝的。如果是使用 kNN,对于一个测试数据我们要测量它到每一个样本的距离,从而根据最近邻居分类。测量所有的距离需要足够的时间,并且需要大量的内存存储训练样本。但是分类下图所示的数据真的需要占用这么多资源吗?
图像处理|支持向量机SVM
文章图片

我们在考虑另外一个想法。我们找到了一条直线,f (x) = a x 1 {{x}_{1}} x1? + b x 2 {{x}_{2}} x2? + c,它可以将所有的数据分割到两个区域。当我们拿到一个测试数据 X 时,我们只需要把它代入 f (x)。如果 |f (X)| > 0,它就属于蓝色组,否则就属于红色组。我们把这条线称为决定边界(Decision_Boundary)。很简单而且内存使用效率也很高。这种使用一条直线(或者是高位空间种的超平面)上述数据分成两组的方法成为线性分割。
从上图中我们看到有很多条直线可以将数据分为蓝红两组,那一条直线是最好的呢?直觉上讲这条直线应该是与两组数据的距离越远越好。为什么呢?因为测试数据可能有噪音影响(真实数据 + 噪声)。这些数据不应该影响分类的准确性。所以这条距离远的直线抗噪声能力也就最强。所以 SVM 要做就是找到一条直线,并使这条直线到(训练样本)各组数据的最短距离最大。下图中加粗的直线经过中心。
图像处理|支持向量机SVM
文章图片

要找到决定边界,就需要使用训练数据。我们需要所有的训练数据吗?不,只需要那些靠近边界的数据,如上图中一个蓝色的圆盘和两个红色的方块。我们叫他们支持向量,经过他们的直线叫做支持平面。有了这些数据就足以找到决定边界了。我们担心所有的数据。这对于数据简化有帮助。
We need not worry about all the data. It helps in data reduction.
到底发生了什么呢?首先我们找到了分别代表两组数据的超平面。例如,蓝色数据可以用ω T {{ ω}^{T}} ωTx+ b 0 {{b}_{0}} b0? > 1 表示,而红色数据可以用ω T {{ ω}^{T}} ωTx+ b 0 {{b}_{0}} b0? < 1 表示,ω 叫 做权重向量(ω = [ ω 1 {{ω}_{1}} ω1?,ω 2 {{ω}_{2}} ω2?, . . . ,ω 3 {{ω}_{3}} ω3?]),x 为特征向量(x = [ x 1 {{x}_{1}} x1?,x 2 {{x}_{2}} x2?, . . . ,x n {{x}_{n}} xn?])。 b 0 {{b}_{0}} b0? 被成为 bias(截距?)。权重向量决定了决定边界的走向,而 bias 点决定了它(决定边界)的位置。决定边界被定义为这两个超平面的中间线(平面),表达式为 ω T {{ ω}^{T}} ωT x+ b 0 {{b}_{0}} b0?= 0。从支持向量到决定边界的最短距离为d i s t a n c e s u p p o r t v e c t o r {{distance}_{support vector}} distancesupportvector? = 1/||ω||。边缘长度为这个距离的两倍,我们需要使这个边缘长度最大。我们要创建一个新的函数 L(ω, b0) 并使它的值最小:
图像处理|支持向量机SVM
文章图片

其中 t i {{t}_{i}} ti?是每一组的标记, t i {{t}_{i}} ti?∈ [ 1, 1]。
【图像处理|支持向量机SVM】非线性数据分割
想象一下,如果一组数据不能被一条直线分为两组怎么办?例如,在一维空间中 X 类包含的数据点有(-3,3),O 类包含的数据点有(-1,1)。很明显不可能使用线性分割将 X 和 O 分开。但是有一个方法可以帮我们解决这个问题。使用函数 f(x) =x 2 {{ x}^{2}} x2 对这组数据进行映射,得到的 X 为 9,O 为 1,这时就可以使用线性分割了。
或者我们也可以把一维数据转换成两维数据。我们可以使用函数 f (x) =( x { x} x,x 2 {{ x}^{2}} x2)对数据进行映射。这样 X 就变成了(-3,9)和(3,9)而 O 就变成了(-1,1)和(1,1)。同样可以线性分割,简单来说就是在低维空间不能线性分割的数据在高维空间很有可能可以线性分割。
通常我们可以将 d 维数据映射到 D 维数据来检测是否可以线性分割(D>d)。这种想法可以帮助我们通过对低维输入(特征)空间的计算来获得高维空间的点积。我们可以用下面的例子说明。
假设我们有二维空间的两个点:p = ( p 1 {{p}_{1}} p1?,p 2 {{p}_{2}} p2?) 和 q = ( q 1 {{q}_{1}} q1?,q 2 {{q}_{2}} q2?)。用 ? 表示映射函数,它可以按如下方式将二维的点映射到三维空间中:
图像处理|支持向量机SVM
文章图片

我们要定义一个核函数 K (p, q),它可以用来计算两个点的内积,如下所示
图像处理|支持向量机SVM
文章图片

这说明三维空间中的内积可以通过计算二维空间中内积的平方来获得。这可以扩展到更高维的空间。所以根据低维的数据来计算它们的高维特征。在进行完映射后,我们就得到了一个高维空间数据。
除了上面的这些概念之外,还有一个问题需要解决,那就是分类错误。仅仅找到具有最大边缘的决定边界是不够的。我们还需要考虑错误分类带来的误差。有时我们找到的决定边界的边缘可能不是最大的但是错误分类是最少的。所以我们需要对我们的模型进行修正来找到一个更好的决定边界:最大的边缘,最小的错误分类。评判标准就被修改为:
图像处理|支持向量机SVM
文章图片

下图显示这个概念。对于训练数据的每一个样本又增加了一个参数ξ i {{ξ}_{i}} ξi?。它表示训练样本到他们所属类(实际所属类)的超平面的距离。对于那些分类正确的样本这个参数为 0,因为它们会落在它们的支持平面上。
图像处理|支持向量机SVM
文章图片

现在新的最优化问题就变成了:
图像处理|支持向量机SVM
文章图片

参数 C 的取值应该如何选择呢?很明显应该取决于你的训练数据。虽然没有一个统一的答案,但是在选取 C 的取值时我们还是应该考虑一下下面的规则:
? 如果 C 的取值比较大,错误分类会减少,但是边缘也会减小。其实就是错误分类的代价比较高,惩罚比较大。(在数据噪声很小时我们可以选取较大的 C 值。)
? 如果 C 的取值比较小,边缘会比较大,但错误分类的数量会升高。其实就是错误分类的代价比较低,惩罚很小。整个优化过程就是为了找到一个具有最大边缘的超平面对数据进行分类。(如果数据噪声比较大时,应该考虑)

    推荐阅读