支持向量机
感知机
我们先来考虑一个感知机的问题。如何寻找一个能将数据集分成两类的超平面?对于线性可分的数据集,可能有很多很多选择。那么,我们应该如何选择一个“最好的”、泛化能力最强的超平面呢?我们可能会想到前文的线性判别分析,但这一算法不能将数据集完全分开。直觉告诉我们,我们应该选择一个在两类样本正中间的超平面。这个超平面距离两类样本的最近点的距离最远。的确,这一算法在实际的模型中表现较好,并且如果利用核函数,该算法还适用于线性不可分的情况。有了这一直观的感受的基础,我们就给出下面的定义:
一个点对应的间隔是指其到分界超平面的垂直距离。SVM 最大化所有训练样本的最小间隔。具有最小间隔的点叫做支持向量。
对于一个分类超平面
推导过程
下面的推导,可以通过平面情况画图辅助理解。
假设超平面
由于
为了方便,我们规定距离为正,那么
对于这一公式,是不是和高中的点到直线的距离公式很像呢?例如,给定直线
这一公式的推导也是类似的。
线性支持向量机
分类与评价
- 怎样分类?当
时 属于正类,当 时 属于负类。 - 对于任何一个样例,我们可以通过将真实标签乘上预测标签,得到一个值。如果该值为正,则说明预测正确,否则预测错误。假设我们的标签满足
,那么针对一个预测及其准确的模型,它的预测结果应该满足 。
SVM 的形式化描述
SVM 解决的问题就是求一个优化问题:
目前为止,由于
假设某个最优解为
因此,我们可以限制
支持向量与间隔的示意图
下面问题就变为在限制
下面,我们使用拉格朗日乘子法来求解。令拉格朗日乘子为
为什么拉格朗日乘子非负?KKT 条件是什么?
常见的拉格朗日乘子法是在约束为等式
下面我们考虑约束为不等式的情况。例如求解最小化问题
我们可以通过引入拉格朗日乘子
我们尝试把它转换为求解函数
但显然,我们需要对其施加更多的约束。首先,我们要将
综合上述讨论,我们得到了 KKT 条件:
下图是另一种,
最大化 E
当最优时,有
将结果代回拉格朗日函数,我们可以得到新的拉格朗日函数
将我们的结果总结一下,利用
其中
SVM 的对偶形式
在原来的空间中,我们研究的变量是
假设我们在对偶空间中,我们已经求得了最优的
求得。对于
由此,对于某一个特定的
而对于所有样本,我们取其平均值即可
Soft Margin 软间隔
对于原先的强约束
但是,犯错误是会受到惩罚的。我们可以通过引入一个正则化
通过调整
在对偶空间中,我们的拉格朗日函数其实没有改变,只是对于
非线性支持向量机
当数据集是线性可分的时候,线性支持向量机的表现是非常好的。但是,当数据集是线性不可分的时候,我们就需要引入核函数来将数据映射到高维空间中,使得数据集变得线性可分。显然,当原始空间是有限维时,那么一定存在一个高维特征空间使样本可分。这就是一种非线性支持向量机的基本思想。
核函数
我们可以看下面一个例子: 假设
如果定义
核支持向量机
我们利用核函数,可以将原来的优化问题转化为:
- 对偶形式:
分类边界:
预测:
这样,我们就可以通过核函数将数据映射到高维空间中,使得数据集在新的空间中变得线性可分。
下面,我们给出判断特征映射存在的一个充要条件:
对于任何满足
则称
一种等价形式是:对于任何一个样本集合
常见核函数
- 线性核函数:
- 多项式核函数:
- 高斯核函数:
一个核的例子(蓝色:Ground Truth,绿色:学习分类边界)
RBF 核函数
在机器学习中(尤其是支持向量机理论中),径向基函数核(Radial Basis Function Kernel,简称 RBF 核)特指高斯核函数
它的特征映射函数为无穷维,其形式为
这是因为
容易看出,
使用 SciKit-Learn
中的 SVC
类,我们可以通过 kernel='rbf'
来使用 RBF 核函数。
from sklearn.svm import SVC
rbf_svm = SVC(kernel='rbf', C=C, gamma=gamma, random_state=42)
rbf_svm.fit(X_train, y_train)
y_pred = rbf_svm.predict(X_test)
2
3
4
5
SVC
类构造函数的参数 gamma
控制了高斯核函数的 C
是前文软间隔的惩罚系数。