- 原文地址:Support Vector Machine (SVM) Tutorial
- 原文做者:Abhishek Ghose
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:zhmhhu
- 校对者:TrWestdoor, 1992chenlu
在 Statsbot 团队发布关于时间序列异常检测的帖子以后,许多读者要求咱们告诉他们有关支持向量机的方法。如今是时候在不涉及复杂数学知识的状况下向您介绍SVM,并分享有用的库和资源以帮助您入门了。html
若是您已经使用机器学习来执行分类,您可能据说过支持向量机(SVM)。50 多年前被引入,它们随着时间的推移而发展,而且已经适应了各类其余问题,如回归分析、异常值分析和排名。前端
SVM 是许多机器学习从业者的最佳工具。在[24]7,咱们也使用它们来解决各类问题。node
在这篇文章中,咱们将尝试深刻了解 SVM 的工做原理。我会专一于创建直觉而并不追求严谨。这基本上意味着咱们将尽量多地跳过数学并创建起对工做原理的直觉理解。android
假设您的大学提供机器学习(ML)课程。课程导师观察到,若是学生擅长数学或统计学,他们将得到最大的收益。随着时间的推移,他们记录了这些科目的入学学生的分数。此外,对于其中的每个学生,他们都有一个描述他们在 ML 课程中表现“好”或“差”的标签。ios
如今,他们想要肯定数学和统计学分数与 ML 课程中的表现之间的关系。也许,根据他们发现的内容,他们但愿指定入学课程的先决条件。git
状况会怎么样呢? 让咱们从表示他们拥有的数据开始。咱们能够绘制一个二维图,其中一个轴表明数学分数,而另外一个表明统计分数。具备特定分数的学生在图表上显示为一个点。github
点的颜色——绿色或红色——表明他在 ML 课程中的表现:分别为“好”或“差”。web
绘出来的图有多是这样的:算法
当学生要求报名时,咱们的教师会要求她提供她的数学和统计学分数。根据他们已有的数据,他们会对 ML 课程中的表现作出有根据的的猜想。后端
咱们本质上想要的是某种“算法”,你能够在其中输入表格的“得分元组”(math_score,stats_score)。它会告诉你某个学生是图形上的红点仍是绿点(红色/绿色也可称为类或标签)。固然,该算法以某种方式体现了咱们已经拥有的数据中存在的模式,也称为训练数据。
在这种状况下,找到穿过红点即和绿点集之间的直线,而后肯定得分元组落在该线的哪一侧,是一个很好的算法。咱们采起一方——绿色方面或红色方面——做为她在课程中最有可能表现的一个指标。
这里的直线就是咱们的分割边界(separating boundary)(由于它分隔了标签)或分类器(咱们用它来对点进行分类)。该图展现了在咱们的问题中两种都有可能的产生的分类器。
这是一个有趣的问题:上面的两条线均可以将红色和绿色的数据集分开。咱们是否有充分的理由选择其中一个而不是另外一个?
请记住,分类器的价值不在于它如何区分训练数据。咱们最终但愿它对还没有看到的数据点进行分类(称为测试数据)。鉴于此,咱们但愿选择一条线来捕获训练数据中的基本模式,所以颇有可能它在测试数据上表现良好。
上面的第一条直线看起来有点“倾斜”。在它的下半部分附近,它彷佛太靠近红点色数据集了,而在它的上半部分它太靠近绿色数据集了。固然,它能够完美地分离训练数据,可是若是测试点离数据集稍远一点,那么它极可能会获得一个错误的标签。
第二条直线没有这个问题。例如,看看下图中已正方形显示的测试点以及分类器指定的标签。
第二条直线尽量远离两个数据集,同时使训练数据正确分离。它经过两个数据集的中间部分,它不那么“冒险”,能够为每一个类提供一些空间来布置数据分布,从而很好的适用于测试数据。
SVM 试图找到这第二种线。咱们经过视觉选择了更好的分类器,但咱们须要更精确地定义基础原理以便在通常状况下应用它。这是 SVM 的简化版本:
距离这条直线的最近那些点称为支持向量(support vectors)。他们围绕这条线定义的区域称为间隔(margin)。
下面显示的是第二条直线的支持向量:带有黑色边缘的点(有两个)和间隔(阴影区域)。
支持向量机为您提供了一种在许多可能的分类器之间进行选择的方法,以确保以更高的正确率标记测试数据。这种方法很简洁吧?
虽然上图显示了在二维空间中的直线和数据,但必须注意 SVM 在任意数量的维度上均可以运行; 在这些维度中,他们找到了二维直线的类比。
例如,在三维空间中,他们寻找平面(plane)(咱们将很快看到这个例子),而且在更高的维度中,他们寻找超平面(hyperplane) ——二维直线和三维平面到任意数量的维度的推广。
可由直线(或一般为超平面)分隔的数据称为线性可分(linearly separaterable) 数据。超平面充当线性分类器(linear classifier)。
咱们在最后一节中查看了彻底线性可分离数据的简单状况。然而,真实世界的数据一般是混乱的。你几乎总会遇到一些线性分类器没法正确分隔的实例。
如下是此类数据的示例:
显然,若是咱们使用线性分类器,咱们永远没法彻底分离标签。咱们也不想彻底抛弃线性分类器,由于除了一些错误的点以外,它看起来彷佛很适合这个问题。
SVM 如何处理这个问题?它们容许您指定您愿意接受的错误数量。
您能够为 SVM 提供一个名为“C”的参数;这容许你决定如下二者之间的权衡:
值得重申的是,这是一个 权衡(tradeoff) 办法。您能够在 代价(expense) 范围内为训练数据选择更好地分类器。
下面的图显示了当咱们增长 C 的值时,分类器和间隔是如何变化的(支持向量未显示):
注意当咱们增长 C 的值时,直线如何“倾斜”。在高值时,它会尝试容纳图表右下方存在的大多数红点。这可能不是咱们想要的测试数据。C=0.01 的第一个图彷佛更好地捕捉了整体趋势,尽管与 较高 C 值的结果相比,训练数据的准确度较低。
因为这是一个权衡办法,请注意当咱们增长 C 的值时,间隔的宽度会缩小。
在前面的例子中,间隔是数据点的“无人之地”。在这里,咱们看到不可能有这样一种情况,既有一个良好的分割边界,又在间隔中不存在任何点。实际上一些点进入到了间隔里面。
一个重要的实际问题是为 C 肯定一个好的值。因为现实世界的数据几乎从不可分离,所以这种需求常常出现。咱们一般使用像 交叉验证(cross-validation) 这样的技术为 C 选择一个好的值。
咱们已经看到支持向量机如何系统地处理完美/几乎线性可分离的数据。它如何处理绝对不可线性分离的数据的状况呢?毕竟,不少现实世界的数据属于这一类。固然,寻找超平面已再也不适用。鉴于 SVM 在这项任务上表现出色,这彷佛很不幸。
如下是非线性可分数据的示例(这是着名的 XOR 数据集的变体),与线性分类器 SVM 一块儿显示:
你必定会认为这看起来不太好。咱们在训练集上的准确率只有 75% ——这是只用一条直线进行分隔所能达到的最优性能。更重要的是,这条直线很是靠近一些数据。最优的准确度也并非很好,并且为了达到平衡,这条线几乎彻底跨过了一些点。
咱们须要作得更好
这就是我对 SVM 最喜欢的一点。这是咱们到目前为止所拥有的:咱们有一种很是擅长寻找超平面的技术。可是,咱们也有不可线性分离的数据。那么咱们该怎么办?将数据投影到一个能够线性分离的空间,并在这个空间中找到一个超平面!
我将一步一步地讲解这个想法。
咱们从上图中的数据集开始,并将其投影到三维空间中,其中新坐标为:
这就是投影数据的样子。你看到咱们能够在平面上滑动的平面吗?
让咱们运行 SVM 吧:
好啦!咱们完美地将标签分离!让咱们将平面投射回原始的二维空间,看看分割边界是什么样的:
在训练数据集上有 100% 的精度而且分隔边界不会太靠近数据!好极了!
原始空间中分割边界的形状取决于投影。在投影空间中,这每每是一个超平面。
请记住,投影数据的主要目的是为了利用 SVM 发现分隔超平面的能力。
将其映射回原始空间时,分割边界再也不是直线。对于间隔和支持向量也是如此。就咱们的视觉直觉而言,它们在投射空间中是有意义的。
看看它们在投影空间中的样子,而后是原始空间。3D 间隔是分离超平面上方和下方的平面之间的区域(没有阴影以免视觉混乱)。
在投影空间中有 4 个支持向量,这彷佛是合理的。它们位于定义间隔的两个平面上。在原始空间中,它们仍然处在间隔上,但到这一步彷佛还不够。
让咱们退一步分析发生的事情:
看起来我彻底明确该怎么作——在那里放置一个 2 的平方根!
在这个例子中,我想展现的是向高维的投影是如何工做的,因此我选择了一个很是具体的投影。通常来讲,这一点是很难知道的。然而,咱们所知道的是,因为 Cover 定理,当投影到更高维度时,数据更可能是线性可分的。
在实践中,咱们尝试一些高维投影,看看哪些有效。实际上,咱们能够将数据投影到无限维度,而且一般效果还不错。这值得详细讨论,也就是下一节的内容。
不。为了使上面的例子易于掌握,个人作法看起来好像咱们须要首先投影数据。事实上,你要求 SVM 为你进行投影。这有一些好处。首先,SVM 使用一些名为**核函数(kernel)**的东西进行这些投影,这些投影很是快(咱们很快就会看到)。
另外,还记得我在前一节提到的投射到无限维度吗?若是你本身投影数据,你如何表示或存储无限维度?事实证实,SVM 对此很是聪明,一样得益于核函数。
如今是时候来看看核函数了。
最后,让SVM 有效工做是有秘诀的。这也是咱们须要学习数学知识的地方。
让咱们来看看到目前为止咱们所看到的状况:
看起来,将 SVM 广泛适用于各类状况的一件重要操做是是将它投射到更高的维度。这就是核函数的用处。
首先,说点题外话。
SVM 的一个很是使人惊讶的地方是,在它使用的全部数学运算中,精确投影,甚至维数的数量都没有显现。你能够根据各类数据点(表示为向量)之间的点积(dot products) 来表达全部内容。对于 p 维向量的 i 和 j,其中第一个下标表示某一个点,第二个下标表示维度编号:
点积是这样定义的:
若是咱们的数据集中有 n 个点,则 SVM 仅仅须要经过每对点的点积来构建分类器。仅此而已。当咱们想要将数据投影到更高维度时,也是如此。咱们不须要为 SVM 提供精确的投影;咱们须要在投影空间中的全部点的组合之间计算点积。
这是有重大意义的,由于这正是核函数所作的。核函数(kernel function的缩写)在原始空间中将两个点做为输入,并直接在投影空间中给出点积。
让咱们从新审视以前作过的投影,看看咱们是否能够提出相应的核函数。咱们还将留意为投影执行的计算次数,而后计算点积——看看如何使用核函数进行比较。
对于点 i:
咱们相应的投影点是:
要计算此投影,咱们须要执行如下操做:
总共,1+1+2 = 4 次乘积。
新维度中的点积是:
要计算两个点 i 和 j 的点积,咱们须要先计算它们的投影。所以,4 + 4 = 8 次乘积,而后点积自己须要 3 次乘法和 2 次加法。
总之,就是:
总共是 11 + 2 = 13 次运算。
我声明这个核函数的结果是同样的:
咱们首先在原始空间中取矢量的点积,而后对结果进行平方运算。
让咱们展开它并检查个人说法是否正确:
确实如此。这须要多少次运算?看看上面的第(2)步。要计算二维的点积,我须要 2 次乘法和 1 次加法。平方是另外一种乘法。
因此,总共是:
共计 3 + 1 = 4 次运算。这只是咱们以前须要的进行的 31% 的运算量。
看起来使用核函数来计算咱们须要的点积更快。这可能看起来不是什么大问题:咱们正在对比 4 次运算和 13 次运算,可是随着输入点的维度愈来愈多,而且投影空间的维度愈来愈高,大型数据集的计算节省的时间就愈来愈多。这就是使用核函数的一个巨大优点。
大多数 SVM 库已经预先打包了一些流行的核函数,如 多项式、径向基函数(RBF)和Sigmoid函数。当咱们不使用投影时(如本文的第一个例子),咱们在原始空间中计算点积——咱们把这个称之为线性核函数。
其中许多核函数为您提供了额外的手段,能够根据您的数据进一步调整它。例如,多项式核函数:
容许您选择 c 和 d 的值(多项式的次数)。对于上面的 3D 投影,我使用了 c = 0 和 d = 2 的多项式核函数。
可是咱们尚未完成核函数的强大功能!
还记得我以前提到过的投射到无限维度吗?若是您尚未猜到,其实让它工做的方法就是拥有合适的核函数。这样,咱们就没必要对输入数据进行投影,也不用担忧存储无限维数据的问题。
若是你有准确的投影数据,核函数将会计算点积。
RBF 核函数一般用于特定的无限维投影。咱们将不在这里进行数学计算,请查看本文末尾的参考资料。
咱们怎样才能在无限维度的状况下仍然能够计算点积?若是您发现这个问题使人困惑,请考虑咱们如何计算无穷级数的和。相似的,点积中有无限项,但刚好存在计算其总和的公式。
这回答了咱们在上一节中提出的问题。总结一下:
有不少 SVM 库供你开始练习:
像 scikit-learn 这样的许多通用 ML 库也提供 SVM 模块,这些模块一般是专用 SVM 库的包装器。个人建议是从通过试验测试的 libSVM 开始。
libSVM 可用做命令行工具,但下载文件也捆绑了 Python、Java 和 Matlab 包装器。只要你有一个包含 libSVM 可以理解的格式的数据文件(下载的 README 文件解释了这个,以及其余可用的选项)你就可以使用它。
事实上,若是你须要很是快速地了解不一样的核函数和不一样的 C 值等等是如何影响寻找分割边界的,请在其主页上尝试使用“图形界面”。标记属于不一样类的数据点,选择 SVM 参数,而后点击 Run!
我火烧眉毛地迅速标出几个点:
是的,我不是让 SVM 变得容易。
而后我尝试了几个核函数:
界面不显示分割边界,但显示 SVM 学习属于特定标签的区域。如你所见,线性核函数彻底忽略了红点。它认为整个空间为黄色(一说绿色)。可是 RBF 核函数巧妙地使用了戒指形状的区域覆盖了红色标记!
咱们一直主要依靠视觉上的直观理解。虽然这是得到初步理解的好方法,但我强烈建议您深刻挖掘。视觉上的直观理解的例子可能不足以理解间隔宽度以及用于非线性可分离状况的支持向量。
请记住,这些数量是经过优化权衡来决定的。除非你去看数学原理,不然一些结果可能看似违反直觉。
数学有用的另外一个方面是理解核函数。我在这篇短文中几乎没有介绍过 RBF 核函数。我但愿它的“神秘”感——它与无限维投影的关系再加上最后一个数据集(“环”)上的奇妙结果——已经说服你去仔细研究它。
我推荐的资源:
好好学习,每天向上!
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。