手记

机器学习入门笔记系列(9) | SVM(支持向量机)

一、SVM代价函数

支持向量机(SVM, Support Vector Machines)是一种非常流行与强大的监督算法。

SVM 的代价函数与逻辑回归的代价函数很相似。

逻辑回归与 SVM 的代价函数

现在定义 分别为当 y=1 的分类代价,当 y=0时的分类代价。

SVM 代价函数演化过程

其中,参数 C 相当于 。当算法过拟合时,C 应该减小;当算法欠拟合时,C 应该增加。

SVM 代价函数最终形态

如果你有一个正样本,即, 则只有在 时,。换句话说,如果你有一个正样本,我们会希望

反之,如果有一个负样本,即,则只有在 时,

SVM 优化目标

最后,SVM 的假设函数 不再代表 的概率,而是直接输出预测值0或1

SVM 假设函数

二、大边距分类器

在SVMs中,决策边界有一个特殊的属性:尽可能远离正样本和负样本。决策边界与离便觉最近样本的距离称为边距。 由于 SVM 最大化此边距,因此通常称为「大边距分类器」。

大边距分类器

SVM 需要尽可能最大化边距,那么只有参数 C 值很大才能实现大边距。

因为参数 C 值很大,想要 ,我们必须选择满足 的参数 。这样,我们的优化目标:

2.2 数学解释:SVM 为何被称为大边距分类器?

解释之前需要讲解向量内积的知识:

向量内积数学含义

为了方便讲解,令 前者方便可视化,后者使决策边界过原点。

之前讲想要最小化代价函数时,我们得到如下结论:

如果 y = 1,我们希望
如果 y = 0,我们希望

根据向量内积,得 ,就有

如果 ,我们希望
如果 ,我们希望

因为只有参数 C 值很大才能实现大边距。

三、核函数(Kernels)

核函数允许 SVM 制作复杂的非线性分类器。

给定特征 ,根据与标志 的接近度计算出新的特征 ,即

对应的,SVM 代价函数变为

其中,函数就是核函数。SVM 有很多核函数,不同核函数运用场景也不同。常见的核函数是「高斯核函数」,如下图所示。

高斯核函数

高斯核函数有如下的特点如下图所示。换句话说,当特征 与标志 越接近,新特征 越接近 1;当特征 与标志 越远,新特征 越接近 0。

高斯核函数的特点

3.1 高斯核函数如何选取标志 呢?

这里提供一种方法:让每一个样本 等于每一个标志 ,即

那么,就有了 ,可以理解为

3.2 参数 C 与 的取值对高斯核函数的影响

核函数的参数

2.3 核函数的选取原则

不是所有的函数都能作为核函数,核函数必须满足一个技术性要求「默塞尔定理」,需要这个条件的原因是 SVM 算法或者 SVM 实现函数有许多熟练的数值优化技巧,为了有效求解参数 ,在最初的假设,这些决策都是用于把我们的注意力仅仅限制于可以满足「默塞尔定理」的核函数,这个定理的所做就是确保所有的 SVM 软件包能够使用大类的优化方法从而快速求解参数

四、SVM 的使用

现在已经有很多编写并优化过的 SVM 库可供直接调用,如 'liblinear' 和 'libsvm' 。 在实际应用中,应该调用 SVM 库,而不是自己编程实现 SVM 算法。

还需要注意两点:

  1. 选用高斯核函数时,要先对原特征 进行特征缩放;

  2. 并非所有相似性函数都是有效的核函数。 它们必须满足“Mercer定理”,这保证了 SVM 包中对核函数优化的运行正确。

Tips:大部分 SVM 软件包会自动增加特征 ,对于这类 SVM 软件包就不需要人工在数据集中增加特征 。最好,在使用某个 SVM 软件包之前,查看是否需要人为增加特征

五、逻辑回归与 SVM 选择

n = 特征数量( )
m = 样本数量

  1. 时,选用 逻辑回归模型;

  2. 较小, 适中时,选用高斯核函数的 SVM (比如n = 1~1000,m = 10~10,000);

  3. 时,就需要先增加特征后,再选用逻辑回归模型;

Tips:神经网络都能很好地应对上面几种情况,但是神经网络训练速度较慢

总结

SVM 实现步骤:

  1. 提取特征;

  2. 选择核函数,如果是高斯函数,还需要先进行特征缩放;

  3. 调用 SVM 软件包;

  4. 使用训练集训练模型,调整参数 C 和 执行 SVM;

  5. 用验证集计算模型误差率;

  6. 选择产生最小误差率的参数 C 和

% X, y, Xval, Yval 分别是训练集特征向量、训练集标签、验证集的特征向量、验证集标签C_list = [0.01,0.03,0.1,0.3,1,3,10,30];
sigma_list = [0.01,0.03,0.1,0.3,1,3,10,30];
min = [-1,0,0];for i = 1:size(C_list(:),1)  for j = 1:size(sigma_list(:),1)
    model= svmTrain(X, y, C_list(i), @(x, l) gaussianKernel(x, l, sigma_list(j)));
    predictions = svmPredict(model, Xval);  
    error = mean(double(predictions ~= yval));    if min(1) == -1 || min(1) > error
      min = [error, C_list(i), sigma_list(j)];    end
  endfor
endfor



作者:数据搬瓦工
链接:https://www.jianshu.com/p/a2b23d501ca3


0人推荐
随时随地看视频
慕课网APP