opencv python教程简书_OpenCV-Python教程:52.理解SVM

理论

线性可分离数据

设想下面的图片,有两种类型的数据,红色和蓝色。在kNN里,对于测试数据,我们对所有训练样本测量他们的距离,并取最小距离的那个。这需要很多时间来测量所有距离并且需要很多内存来存所有的训练样本。但是对于图像里的数据,我们需要那么多么?

考虑另外一个想法,我们找到一根线,f(x) = ax1 + bx2 + c把数据分成两个区域。当我们得到一个新的测试数据 X,只要在f(x)里替换它,如果f(X) > 0, 它属于蓝组,否则它属于红组。我们叫这个线判别边界。这个方法很简单并且省内存。数据可以被直线分成两组(或者高维的超平面)被称作线性可分离

所以在上面的图像里,你可以看到很多这样的直线。我们应该用哪个?直观上我们可以说直线应该离所有点越远越好。为什么?因为输入数据可能有噪音。这种数据不应该影响分类准确性。所以取最远的直线会让噪音影响不了。那么SVM做了什么让它找到一根直线(或者超平面)让直线到所有训练数据的最近距离是最大的。看下面图像里穿过中心的粗线

所以要找到这个判别边界,你需要训练数据,你需要所有的数据么?不,值需要和相对组接近的就很有效了。在我们的图像里,它们是蓝实心圆圈和红色实心方块。我们叫他们支持向量,穿过他们的直线被叫做支持平面,他们足够找到我们的判别平面。我们不需要考虑所有数据。

实际发生的是,找到的前两个超平面最能表现数据。比如蓝色数据由

表示,红色数据由

表示,w是权重向量,x是特征向量。b0是偏置。权重向量决定判别边界的方向,偏置点决定它的位置。现在判别边界被定义为这些超平面中间,表达为

从支持向量到判别边界的最小距离由

给出。边缘是这个距离的两倍,我们需要最大化这个边缘。我们需要最小化一个新的函数L(w.b0)

ti是每个类的标签,ti ∈[-1, 1].

非线性可分离数据

考虑某些数据无法通过直线被分离成两组的情况。比如,一个一维数据'X' 是属于-3 和 +3 ,'O' 是 -1 和 +1。很显然他无法被线性分离。但是有方法可以解决这类问题。如果我们把这个数据通过函数映射,f(x) = x的平方,我们可以得到'X' 是9, 'O'是1,可以线性分离了。

否则我们可以转换这个一维数据到二维。我们可以使用

函数来映射数据,这样'X' 变成(-3, 9)和(3, 9)而'O'变成(-1, 1)和(1, 1)。这也是线性可分离的。简单来说,对于低维空间的非线性可分离的数据在高维空间会很有机会变成线性可分离的。

一般来说,是可以把一个d维的空间映射到D维空间(D > d)来检查是否可能线性分离。在低维(特征)空间执行计算可以帮助在高维(核)空间计算点积。

假设有两个点在二维空间中,p = (p1, p2)和q = (q1, q2)。让φ为二维点到三维空间的映射函数:

让我们定义一个核函数K(p, q)在两点间做点积

这表示,一个三维空间的点积可以是二维空间的点积的平方。这可以被应用到更高维空间。所以我们可以计算低维空间来得到高维特征。当我们映射了他们,我们可以得到高维的空间。

除了这个概念,还有可能分类错误,只是找到最大边缘的判别边界并不是十分有效。我们需要考虑分类误差。有时候,了可能可以用少的边缘找到判别边界,但是可以减小分类错误,不过我们需要修改模型这样它可以用最大边缘来找判别边界。但是更少的分类错误。

下面的图像展示了这个修正,对于训练数据里的每个样本定义了一个新的参数ξi。它是从它对应的训练样本到他们正确的判别区域的距离。对于那些没有分类错误的,他们落在对应的支持平面,所以他们的距离是0.

所以新的优化的问题是:

参数C应该怎么选呢?很显然回答要依赖训练数据是怎么分布的。虽然没有通用答案,但是考虑如下的规则还是有用的:

·C取大值可以解决分类错误较少但是边缘较小的问题。这种情况下要制造分类错误会比较难,因为优化的目标是最小化参数,值循序更少的分类错误。

·C取小值解决较大边缘且更多分类误差的。这种情况不用考虑那么多最小化,所以聚焦在找到有更大边缘的超平面上。

你可能感兴趣的:(opencv,python教程简书)