Support Vector Machine 这个名字挺唬人的,其实思想很朴实:我们有两堆数据(分别标记为「+1类」和「-1类」),想在它们之间找一个分界面,使得两边的点距离这个分界面都够远。这就相当于在两组点中间划出一块深沟,所谓的 support vector(支撑向量)就是卡住边线的那些点(数学家喜欢把「点」叫做「向量」)。
我们令f(x) = w x + b
,假设分界面为w x + b = 0
,即f(x) = 0
,且满足:标记为+1
的点f(x) > 0
,标记为-1
的点f(x) < 0
。那么可以算出某个数据点距离分界面的距离γ
为:
但这个γ
是带正负号的,为了保证γ
永远为正,我们给它乘以sign( f(x) )
(也就是标记的y
值):
我们的目标是,让找到的那个分界面的γ
值最大:
γ
其实是一个以 w 和 b 为参数的函数。我们调整不同的 w 和
b 得到不同的划分方式。
我们把它画出来看看:
最大值点在(0.78801, 1.22344)
,其值为2.18479
。
至于具体怎么找到最大值点的就不写了,大概是用核方法[1]把数据映射到高维空间,再用 Lagarange 乘数法的进阶版本找到极值点。
太多技术细节了,心累☹️
P.S. 据说 SVM 做手写数字识别的精度可以媲美深度学习😱 但我还是不喜欢它,因为它直接一步跳到了结果,中间没有任何人类可以嫁接的知识树(表征)。
参考资料:
- pluskid 的《支持向量机系列》
-
核方法的好处是:既能享受到数据在高维展开以使其线性可分的好处,又能避免高维空间的运算量爆炸。 ↩