Pinvon's Blog

所见, 所闻, 所思, 所想

支持向量机

什么是支持向量机?

假设要将一组数据集分成两类.

如果数据集是二维的, 能否找出一条直线将两组数据分开?

如果数据集是三维的, 能否找出一个平面将两组数据分开?

如果数据集是N维的, 能否找出一个超平面, 将两组数据分开?

如果能找到这样一个超平面, 我们就将其称为 分隔超平面. 我们希望能找到离分隔超平面最近的点, 使它们离分隔超平面尽可能的远. 如果将点到分隔面的距离称为 间隔, 我们希望的就是间隔尽可能的大.(原因是如果我们犯了错, 或者在有限数据上训练分类器的话, 我们希望分类器能够尽可能地健壮一些).

支持向量 就是离分隔超平面最近的那些 . 我们要做的, 就是 最大化支持向量到分隔面的距离.

支持向量机的优缺点: 优点: 泛化错误率低, 计算开销小, 结果易解释. 缺点: 对参数调节和核函数的选择敏感, 原始分类器不加修改仅适用于处理二类问题.

寻找最大间隔

分隔超平面在数学上, 可以写成: \(\pmb w^{T}\pmb x + b\). 其中, \(x\) 相当于一系列的特征, \(w\) 是其系数.

点 \(A\) 到分隔超平面的法线长度为: \(\frac{|\pmb w^{T}\pmb x + b|}{||\pmb w||}\). 如图所示:

1.png

分类器求解的优化问题

既然是分类器, 就需要在得到一系列特征之后, 对数据进行分类.

支持向量机中, 我们使用的函数与Sigmoid函数类似. 不同之处在于, 如果输入小于0, 则输出-1, 反之则输出+1.

我们需要将一系列的特征和系数( \(\pmb w^{T}\pmb x + b\) )作为输入传递给该函数, 根据输出来分类.

使用+1或-1, 而不使用0或1, 是为了方便数学上的处理.

间隔使用 \(label * (\pmb w^{T}\pmb x + b)\) 来表示. 其中, \(label\) 为+1或-1.

如果数据点处于正方向(即+1类)并且离分隔超平面很远时, \(\pmb w^{T}\pmb x + b\) 是一个很大的正数, 乘以 \(label\) 后仍然是个很大的正数.

如果数据点处于负方向(即-1类)并且离分隔超平面很远时, \(\pmb w^{T}\pmb x + b\) 是一个很大的负数, 乘以 \(label\) 后是个很大的正数.

不管怎样, 都是很大的正数, 方便处理.

特征需要自己去提取, 所以现在的目标是要找出系数 \(\pmb w\) 和 \(b\) . 为了找出它们, 还要先找到具有最小间隔的数据点, 即要先找到支持向量.

最大化的间隔可以写成:

2.png

直接求解该问题非常困难. 如果假设 \(label \cdot (\pmb w^{T}\pmb x + b) \geq 1.0\), 且假设数据必须100%线性可分. 使用拉格朗日乘子法, 可以将优化目标函数转化成如下形式:

3.png

约束条件为: \(C \geq \alpha \geq 0\), 且 \(\sum_{i=1}^{m} \alpha_i \cdot label^{(i)} = 0\). 其中, C用于控制"最大化间隔"和"保证大部分点的函数间隔小于1.0".

所以, 问题最终转化成求解所有的 \(\alpha\).

Platt的SMO算法

Platt在1996年发布SMO算法, 用于训练SVM. SMO算法是将大的优化问题分解为多个小优化问题来求解的. 在结果完全相同的同时, SMO算法的求解时间短很多.

工作原理: 每次循环中, 选择两个 \(\alpha\) 进行优化处理. 一旦找到一对合适的 \(\alpha\), 就增大一个同时减小另一个. 所谓"合适", 是指这两个 \(\alpha\) 要在间隔边界之外, 并且还没进行过区间化处理或不在边界上.

简化版SMO

简化版SMO的伪代码:

创建一个alpha向量并将其初始化为0向量
当迭代次数 < 最大迭代次数时
    对数据集中的每个数据向量
        如果该数据向量可以被优化
            随机选择另一个数据向量
            同时优化这两个向量
            如果两个向量都不能被优化, 退出内循环
    如果所有向量都没被优化, 增加循环次数, 继续下一次循环

完整Platt SMO算法

简化版的SMO算法比较耗时. 完整版的SMO通过一个外循环来选择第一个 \(\alpha\), 通过一个内循环来选择第二个 \(\alpha\).

选择第一个 \(\alpha\) 时, 使用两种方法交替进行: 在所有数据集上进行单遍扫描; 在非边界 \(\alpha\) 中实现单遍扫描. 非边界, 指的是 \(\alpha\) 的值不等于0或C.

Comments

使用 Disqus 评论
comments powered by Disqus