支持向量机(SVM)的直觉只有一句话:在两类点之间画一条分界线,而且要离两边的点都尽量远——决定这条线的,只有离得最近的那几个点。
12.1 讲了机器学习的总思路,这一节看一个具体算法把思路落成了什么形状。
一、一句话讲完的直觉
要给两类东西分类,最直接的办法就是在它们中间画一条界线。 可界线能画的位置很多——凭什么是这一条? SVM 的回答是:选那条离两边都尽量远的。 中间那个空隙叫间隔(margin),SVM 要的就是间隔最大的那条线。 为什么追求【尽量远】?因为线离点越远,将来新来的点越不容易分错。
二、支持向量这个名字的来历
一维的情况最好看。一类点在 -0.6 附近、一类点在 0.6 附近: 最佳分界位置就在 0——正好落在两边最近的点的中间。 注意这里的关键:决定分界线的,只有【离得最近的那几个点】。 把远处的点全删掉,分界线一动不动。 这几个点就叫【支持向量】——名字就是从这儿来的:它们【支撑】着这条线。
三、直线画不出来的时候
现实里经常遇到两类点搅在一起、根本画不出直线的情况。 SVM 的办法是:把数据映射到更高的维度,在那里就容易分开了。 打个比方:桌上混在一起的两种豆子,摊平了分不开,可要是能往上抬一层,就分开了。 实现这件事的工具叫核函数,它是个很巧的数学技巧,这里只记结论就够。
四、它的长处和短处
长处:小样本也管用。 别的算法要大量数据,SVM 靠的是【边界上那几个点】。 长处:有理论支撑。 追求最大间隔这件事,不是经验拍脑袋,是能证明的。 短处:数据一大就慢。 短处:核函数和参数要选,选不好效果差很多。 所以它是一种很经典、很值得懂原理的算法,但不一定是每个问题的最优解。
五、动手 Demo:支持向量机
SVM 的直觉是:在两类点之间画一条分界线,而且离两边都尽量远。 用一维数据看这条线是怎么定下来的。
a = [-1.4, -1.1, -0.8, -0.6]
b = [0.6, 0.9, 1.2, 1.5]
lo, hi = max(a), min(b)
print("最近的左点", lo, "最近的右点", hi)
print("间距", hi - lo)
print("最佳分界位置", (lo + hi) / 2)
实跑输出:
--------------------------------------------------------------------
支持向量机
--------------------------------------------------------------------
**支持向量机(SVM)是一种分类算法**,它的直觉只有一句话:
**在两类点之间画一条分界线——而且要离两边的点都尽量远。**
为什么追求【尽量远】?**因为线离点越远,将来新来的点越不容易分错。**
中间那个宽度有个名字:**间隔(margin)。SVM 要的就是间隔最大的那条线。**
一维的情况最好看。实测:**一类点在 -1 附近、一类点在 +1 附近:**
第一类(标签 0) -1.4 -1.1 -0.8 -0.6
第二类(标签 1) 0.6 0.9 1.2 1.5
离得最近的左点 -0.6(它俩之间的间距 = 1.2)
离得最近的右点 0.6
最佳分界位置 0.00(正中间,两边余量一样大)
**关键在这一句:决定分界线位置的,只有【离得最近的那几个点】。**
**把远处的点全删掉,分界线一动不动——这几个点就叫【支持向量】。**
名字就是从这儿来的:**它们【支撑】着这条分界线。**
那要是两类点搅在一起、根本画不出直线呢?
**SVM 有办法:把数据映射到更高的维度,在那里就容易分开了。**
实现这件事的工具叫**核函数**,**它是个很巧的数学技巧,这里只记结论就够。**
实测:最近的左点 -0.6、右点 0.6,间距 1.2,最佳分界位置是 0。 决定这条线的只有离得最近的那几个点——它们就是【支持向量】。
30 秒实验
- 在纸上把最左和最右的点各挪远一点,看分界线位置会不会变。
- 把中间两个最近的点删掉再算一次,看看分界线动没动。
常见误区
- 以为分界线由所有数据决定。只有离得最近的那几个点说了算。
- 以为 SVM 只能画直线。线性不可分时可以用核函数升到更高维度。
自测三问(点开对答案)
1. SVM 想要的分界线有什么特点? —— 离两类点都尽量远,也就是间隔最大的那条线。 2. 支持向量指什么? —— 离分界线最近的那几个点,它们决定了线的位置,其他点删掉也不影响。 3. 为什么追求最大间隔? —— 线离点越远,将来新来的数据越不容易被分错。- ☐ 下一节(12.3 Python交互模式的使用方法)
相关笔记
- 什么是机器学习 — 这套思路的总纲
- 通过机器学习识别手写数字 — 真正上手用一个分类算法
- 尝试交叉验证 — 怎么判断它到底好不好
- ⌨️ 编程原理 · 索引 — 把编程全貌理一遍
- ⚙️ 程序是怎样跑起来的 · 索引