支持向量机(Support Vector Machine)是一种二元分类器,在学习非常复杂的非线性方程时,能够提供更加清晰和更加强大的方式,通常简称为 SVM。
优化目标
图中为逻辑回归的损失函数,稍加改造即为 SVM 的损失函数(粉色)。其中,,当判断 y = 1 时,如果 z > 1, cost 1 = 0,如果 z < 0 则 cost 1 是一条负斜率的直线;当判断 y = 0 时,如果 z < -1,cost 0 = 0,如果 z > 0,则 cost 0 是一条正斜率的直线。
逻辑回归代价函数:
SVM 代价函数:
在 SVM 代价函数中,我们用 和 替换掉逻辑回归中的 和 ,并去掉了 项,这对优化目标不会产生影响。我们还去掉了正则化项中的 ,并在公式第一部分加入了参数 ,其作用类似 ,同样能够起到平衡数据拟合程度和参数惩罚力度的作用。
SVM 的假设函数可以直接输出分类结果,比如:
大间距分类器
上面说到,使得正样本 ,负样本 ,即可实现分类,但 SVM 的代价函数为了把误差降到最小,需要正样本 ,负样本 ,SVM 比一般分类器要求更加严格,目的是要构建一个安全因子或者叫安全间距。
可以发现,黑色决策边界(Decision Boundary)与样本的最小间距(即与蓝色直线的距离)更大,这个距离就叫做支持向量机的间距(Margin),这使得支持向量机具有鲁棒性,它会尽量用大的间距去分离数据,因此支持向量机也被称为大间距分类器(Large Margin Classifier)。
决策边界会受 SVM 代价函数的系数 的影响,如果 较大,决策边界会尽力拟合训练数据,比如图中的异常点,从而决策边界会由黑色直线变为紫色直线。如果 较小,决策边界就会忽略异常点的影响,甚至在数据不是线性可分的情况下也能得到比较好的结果。可以将 比作 ,增大 即减小 ,可以增强模型的拟合能力;减小 即增大 ,可以增强模型的泛化能力。
数学原理
在 SVM 中我们会计算 ,暂且将 记作 ,将 记作 。已知两个二维向量 ,。 的长度(欧几里得长度)等于 的范数 。根据毕达哥斯拉定理:。为了计算 ,需要将 投影到向量 上,所以需要做一个直角投影, 即为向量 在向量 上的投影长度,或者说量。 就等于 的投影长度 乘以 的长度(即 的范数 ),即:
也等于 和 的内积:
值得注意的是, 和 都为实数。当两个向量的夹角小于 90 度的时候, 为正值,当夹角大于 90 度的时候, 为负值。当然,也可以将 投影到向量 上,然后做相同的计算,可以得到相同的结果,即:
点到边界的距离
通常 SVM 的优化目标为 ,为了简化目标,我们先忽略截距项,使 ,并使特征数 ,所以优化目标可以简化为:
因为对于任何实数 来说,。而 即为 的范数 ,所以 SVM 的优化目标就是最小化 。
当我们对某个训练样本 进行预测时,需要计算 ,我们可以将样本 映射到参数向量 上,得到映射长度 ,而 ,那么,我们就可以根据 进行预测,即:
上图绿色直线为 SVM 的决策边界,蓝色直线为参数向量 , 垂直于决策边界,根据条件:
和 分别为正样本 和负样本 在参数向量 上的投影长度,对于正样本 来说, 越大越好,对于负样本 来说, 越小越好。但是我们发现, 和 都很短,说明 很小, 很大,因为 为负数。那么为了预测正确,我们就需要 越大越好,但是我们的优化目标为 ,这意味着 SVM 会将 最小化,可见想要将 变大并不容易。
上图 SVM 的决策边界和参数向量 发生了变化, 仍垂直于决策边界。可以发现,正样本 和负样本 在参数向量 上的投影长度 和 都变长了,根据条件:
增大了,即使减小 , 仍可保持不变。也就是说,即使优化目标 ,将 变小一些,SVM 仍然可以预测正确。所以相对第一条决策曲线,SVM 最终会选择第二条,这也是 SVM 为什么会产生大间距分类的原因,而且 SVM 的间距正是 中最小的那一个,优化目标最小化 ,就是为了最大化间距 。
上面推导过程始终让 ,这么做的目的是让决策边界通过原点,实际结果表明,无论 是否等于 0,对大间距分类器的效果都不会产生太大影响。
核函数
为了拟合这种复杂的非线性决策边界,通常需要构建复杂的多项式特征集合,比如:
现在我们用 代表特征变量:
现在的问题是,我们如何来构建更好的特征 呢?
图中我们是手动选取的三个点 ,称为标记。对于一个新样本 ,我们可以将 和三个标记的相似度作为样本 的特征,即:
其中
表示样本 与标记 的欧式距离的平方( 表示向量 的长度)。而相似度函数 就是核函数,这里所用的核函数 为高斯核函数,事实上还有很多其他的核函数,通常核函数用 表示。相似度公式的分子 也可以写做向量 和标记 之间元素 对应的距离之和。
假如样本 和标记 距离特别近,意味着 ,那么 ;假如样本 和标记 距离特别远,意味着 为一个很大的数,记作 ,那么 。因此,这些特征做的就是衡量样本与每个标记的相似度,如果样本接近标记,那么特征变量接近 1;如果样本远离标记,那么特征变量接近 0。每个标记都着影响着一个特征变量的取值。
上图是 值随 点坐标变化的曲面图和等高线图。假设标记 ,,,当样本 接近标记 时,,当样本 远离标记 时,。所以从图中可以直观的感受到, 表示着样本与标记距离的远近程度。
我们也可以通过改变分母的值,观察核函数的变化。如果减小分母的值,比如 ,可以发现,突起的宽度变窄了,等高线也收缩了,随着 从顶点向周围移动(即 与 的距离变大), 从 1 下降到 0 的速度更快了。相反,如果增大分母的值,比如等于 ,可以发现,突起的宽度变宽了,等高线也扩张了,随着 从顶点向周围移动(即 与 的距离变大), 从 1 下降到 0 的速度更慢了。
若我们的假设函数 ,参数值 ,对于一个新样本(粉红色),我们需要计算 值进行预测。由于该正样本接近 ,远离 和 ,所以 。那么,根据公式可以计算得出 ,所以我们的预测结果 y = 1。
再取一个样本(绿色)做相似计算,由于该样本接近 ,所以 ,根据公式可以计算得出,预测结果也是 y = 1。
再取一个样本(蓝色)做相似计算,由于该样本距离 都很远,所以 都接近 0。那么,根据公式可以计算得出 ,所以我们的预测结果 y = 0。
当训练集所有样本都完成计算,我们会得到一个决策边界(橘红色),在边界区域内,样本的预测结果为 1,在边界区域外,样本的预测结果为 0,这就是通过定义标记点和核函数来得到新的特征变量,从而训练出非常复杂的非线性决策边界的方法。
那么,我们该如何选择标记点和核函数呢?
标记点选取
通常我们是直接将训练样本点作为标记点。 个样本的训练集就可以获得 个标记 。这样一来,特征向量基本上是在描述样本距离每一个训练集样本的距离。
对于一个样本 ,需要计算 和每一个标记(样本)的距离:
并将 个特征加截距项合并为一个 维的特征向量 :
其中, 为截距项,由于特征向量 是 维的,所以参数 也是 维的,这时,我们就可以根据假设函数进行预测了:
以上是我们假设已知参数 来选择特征的过程,那么,我们如何选择参数 呢?我们可以先随机选取 ,然后通过最小化代价函数来拟合参数 。
带有原始特征的代价函数:
将新特征带入代价函数并加入正则项:
我们不对截距项 进行正则化,所以 ,忽略 之后,,其中 可以由 代替, 为一个相对较小矩阵,具体大小取决于所采用的核函数,这是 的一种优化计算方式,可以提升了 SVM 的计算效率,从而使得 SVM 可以应用于更大的数据集。因为在大规模数据的情况下, 的计算量将十分庞大。
事实上,核函数定义特征向量,标记点等技术也可以应用于其他机器学习算法,比如逻辑回归等。但应用于 SVM 的计算技巧不能很好地推广到其他算法,所以将核函数应用到逻辑回归上,计算将十分缓慢。相比之下,SVM 能很好的与核函数以及这些计算技巧结合。
参数优化:
关于如何选择 SVM 优化目标中的参数 和 ,可以采用偏差方差折中。
我们知道 的作用相当于 ,所以较大的 (即较小的 )代表低偏差,高方差,容易过拟合;较小的 (即较大的 ) 代表高偏差,低方差,容易欠拟合。
较大的 ,代表平滑的函数曲线,模型变化幅度小,高偏差,低方差;
较小的 ,代表陡峭的函数曲线,模型变化幅度大,低偏差,高方差。
核函数选取
有以下核函数可供选择:
线性核函数(Linear Kernel)
线性核函数就是不使用核函数,适用于有大量样本特征,少量样本的情况,这时我们需要拟合一个线性的决策边界,因为样本数量不足很容易过拟合。高斯核函数(Gaussian kernel)
需要选择合适的 参数,适用于少量特征,大量样本的情况,可以拟合出非常复杂的非线性决策边界。
注意:使用高斯核函数需要做特征变换(归一化或标准化)来确保 SVM 在计算样本与标记的距离时,不同的特征变量的差异标准是一致的。多项式核函数(Polynomial Kernel)
,其中 为自定义参数,比如 或
可以发现, 和 的内积值可能会很大,适用于 和 都是严格的非负数时,可用保证 和 的内积值永远为正数。其他核函数:字符串核函数(String Kernel)、直方相交核函数(Histogram Intersection Kernel)、卡方核函数(Chi-Square Kernel)等。
注意:通常我们只用线性核函数或高斯核函数,而且不是所有的相似函数都是有效的核函数,核函数需要满足一个技术条件是:必须符合莫塞尔定理。因为 SVM 为了有效的求解参数 ,使用了很多数值优化技巧,默塞尔定理确保了 SVM 的优化方法有效。
多分类
很多 SVM 软件包已经实现并内置了多分类函数。也可以和逻辑回归多分类一样,假设有 个分类,对每个分类分别进行预测,选择预测值 最大的作为正确分类。
如何选择逻辑回归还是支持向量机
当特征数 远大于样本数 时,比如 ,通常建议使用逻辑回归或线性 SVM,因为没有足够的数据来拟合复杂的非线性函数。
当特征数很小,而样本数适中时,比如 ,使用线性 SVM 比逻辑回归更好。
当样本数远大于特征数时,比如 ,通常建议使用逻辑回归或者线性 SVM,因为当数据量超过百万时,高斯核函数的计算会非常慢。
可以发现,逻辑回归和线性核函数非常相似,对于神经网络来说,以上所有情况都适用,前提是结构设计良好的话,但可能训练起来会比 SVM 更慢,而且需要解决局部最优问题,而 SVM 的优化问题属于凸优化,不用担心局部最优问题。
参考
- https://study.163.com/course/introduction/1004570029.htm