为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
机器学习

一、SVM代价函数

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

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

webp

逻辑回归与 SVM 的代价函数

现在定义 cost_0(z),cost_1(z) 分别为当 y=1 的分类代价,当 y=0时的分类代价。

webp

SVM 代价函数演化过程

其中,参数 C 相当于 C = \frac{1} {\lambda}。当算法过拟合时,C 应该减小;当算法欠拟合时,C 应该增加。

webp

SVM 代价函数最终形态

如果你有一个正样本,即y=1, 则只有在 z \geq 1时,cost_1(z) = 0。换句话说,如果你有一个正样本,我们会希望 \theta^Tx \geq 1

反之,如果有一个负样本,即y=0,则只有在 z = \theta^Tx \leq -1 时,cost_0(z) = 0

webp

SVM 优化目标

最后,SVM 的假设函数 h_\theta(x) 不再代表 y=1 的概率,而是直接输出预测值0或1

webp

SVM 假设函数

二、大边距分类器

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

webp

大边距分类器

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

因为参数 C 值很大,想要 min~J(\theta),我们必须选择满足 \sum_{i=1}^{m} (y^{(i)}cost_1(z) + (1-y^{(i)})cost_0(z)) = 0 的参数 \theta。这样,我们的优化目标:
min~J(\theta) =min~( C*0+\frac{1} {2}\sum_{i=1}^{n}\theta_i^2 )= min~\frac{1} {2}\sum_{i=1}^{n}\theta_i^2

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

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

webp

向量内积数学含义

为了方便讲解,令 n=2,\theta_0=0 前者方便可视化,后者使决策边界过原点。

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

如果 y = 1,我们希望 \theta^T x \geq 1
如果 y = 0,我们希望 \theta^T x \leq -1

根据向量内积,得 \theta^T x^{(i)} = p^{(i)} ||\theta||,就有

如果 y^{(i)} = 1,我们希望 p^{(i)} ||\theta|| \geq 1
如果 y^{(i)} = 0,我们希望 p^{(i)} ||\theta|| \leq -1

因为只有参数 C 值很大才能实现大边距。min~J(\theta) \approx min \frac{1} {2}\sum_{i=1}^{n}\theta_i^2 = \frac{1} {2} (\theta_1^2 + \theta_2^2 ) = \frac{1} {2} (\sqrt{\theta_1^2 + \theta_2^2})^2 = \frac{1} {2}||\theta||^2

webp

webp

webp

三、核函数(Kernels)

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

给定特征 x,根据与标志 l^{(1)},..,l^{(m)} 的接近度计算出新的特征 f,即

x^{(i)} = \begin{bmatrix} f^{(i)}_1 = similarity(x^{(i)},l^{(1)})\\ f^{(i)}_2 = similarity(x^{(i)},l^{(2)})\\ ...\\ f^{(i)}_n = similarity(x^{(i)},l^{(n)}) \end{bmatrix}

对应的,SVM 代价函数变为 J(\theta) = C \sum^{m}_{i=1}(y^{(i)}cost_1(\theta^Tf^{(i)}) + (1-y^{(i)})cost_0(\theta^Tf^{(i)})) + \frac{1} {2} \sum^{n}_{j=1}\theta_j^2

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

webp

高斯核函数

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

webp

高斯核函数的特点

3.1 高斯核函数如何选取标志 l^{(1)},...,l^{(n)} 呢?

这里提供一种方法:让每一个样本 x^{(i)} 等于每一个标志 l^{(i)},即 \{l^{(1)} = x^{(1)},l^{(2)} = x^{(2)},..,l^{(m)} = x^{(m)}\}

那么,就有了 x^{(i)} \in \mathbb{R}^{n*1} \Rightarrow f^{(i)} \in \mathbb{R}^{m*1},可以理解为 n = m

x^{(i)} = \begin{bmatrix} f^{(i)}_1 = similarity(x^{(i)},l^{(1)})\\ f^{(i)}_2 = similarity(x^{(i)},l^{(2)})\\ ...\\ f^{(i)}_m = similarity(x^{(i)},l^{(m)}) \end{bmatrix} = \begin{bmatrix} f^{(i)}_1 = similarity(x^{(i)},x^{(1)})\\ f^{(i)}_2 = similarity(x^{(i)},x^{(2)})\\ ...\\ f^{(i)}_m = similarity(x^{(i)},x^{(m)}) \end{bmatrix}

J(\theta) = C \sum^{m}_{i=1}(y^{(i)}cost_1(\theta^Tf^{(i)}) + (1-y^{(i)})cost_0(\theta^Tf^{(i)})) + \frac{1} {2} \sum^{m}_{j=1}\theta_j^2

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

webp

核函数的参数

2.3 核函数的选取原则

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

四、SVM 的使用

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

还需要注意两点:

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

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

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

五、逻辑回归与 SVM 选择

n = 特征数量(x^{(i)} \in \mathbb{R}^{n*1} )
m = 样本数量

  1. n \gg m 时,选用 逻辑回归模型;

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

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

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

总结

webp

SVM 实现步骤:

  1. 提取特征;

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

  3. 调用 SVM 软件包;

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

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

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

% 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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消