这里旨在理解svm,我就找了下知乎,原文地址,部分图片还要截图上传,很烦🤨
趣味SVM
好吧,故事是这样子的:在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏。魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”

于是大侠这样放,干的不错?

然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。

SVM 就是试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。

现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。

然后,在 SVM 工具箱中有另一个更加重要的 trick。 魔鬼看到大侠已经学会了一个 trick,于是魔鬼给了大侠一个新的挑战。

现在,大侠没有棍可以很好帮他分开两种球了,现在怎么办呢?当然像所有武侠片中一样大侠桌子一拍,球飞到空中。然后,凭借大侠的轻功,大侠抓起一张纸,插到了两种球的中间。

现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。

再之后,无聊的大人们,把这些球叫做 「data」,把棍子 叫做 「classifier」, 最大间隙 trick 叫做「optimization」, 拍桌子叫做「kernelling」, 那张纸叫做「hyperplane」。
直观感受看:https://www.youtube.com/watch?v=3liCbRZPrZA
科学解释SVM
Support Vector Machine, 一个普通的 SVM 就是一条直线罢了,用来完美划分 linearly separable 的两类。但这又不是一条普通的直线,这是无数条可以分类的直线当中最完美的,因为它恰好在两个类的中间,距离两个类的点都一样远。而所谓的 Support vector 就是这些离分界线最近的『点』。如果去掉这些点,直线多半是要改变位置的。可以说是这些 vectors(主,点点)support(谓,定义)了 machine(宾,分类器)...


所以谜底就在谜面上啊朋友们,只要找到了这些最靠近的点不就找到了 SVM 了嘛。
如果是高维的点,SVM 的分界线就是平面或者超平面。其实没有差,都是一刀切两块,我就统统叫直线了。
怎么求解 SVM?
关于这条直线,我们知道 (1) 它在离两边一样远,(2)最近距离就是到 support vector,其他距离只能更远。
于是自然而然可以得到重要表达 I. direct representation: :

subject to 所有<u>正确归类的</u>苹果和香蕉到 boundary 的距离都大于等于margin
(可以把 margin 看作是 boundary 的函数,并且想要找到使得是使得 margin 最大化的 boundary,而 margin(*) 这个函数是:输入一个 boundary,计算(正确分类的)所有苹果和香蕉中,到 boundary 的最小距离。)
又有最大又有最小看起来好矛盾。实际上『最大』是对这个整体使用不同 boundary 层面的最大,『最小』是在比较『点』的层面上的最小。外层在比较 boundary 找最大的 margin,内层在比较点点找最小的距离。
其中距离,说白了就是点到直线的距离;只要定义带正负号的距离,是 {苹果 + 1} 面为正 {香蕉 - 1} 面为负的距离,互相乘上各自的 label ∈{+1,-1},就和谐统一民主富强了。
SVM数学表达形式
定义直线为



(此处允许负数出现),如果升级到更高维度,是不是就和上一行一毛一样?
对于 N 个训练点的信息 (点的坐标,苹果还是香蕉) 记为(xi,yi)
上述表达也就是 [1]:

不知为何这是我见过的最喜欢的写法
subject to
||w||=1
就是为了表达方便 [3],后面会取消这个限制
到这里为止已经说完了所有关于 SVM 的直观了解,如果不想看求解,可以跳过下面一大段直接到 objective function。
直接表达虽然清楚但是求解无从下手。做一些简单地等价变换(分母倒上来)可以得到 II. canonical representation (敲黑板

subject to 所有苹果和香蕉到 boundary 的距离大于等于margin
w 不过是个定义直线的参数,知道这一步是等价变换出来的表达就可以了。
为了以后推导方便,一般写成:


这个『1』就是一个常数,这样设置是为了以后的方便
这个选择的自由来自于直线
的参数如果 rescale 成kw和kb不改变距离。
要得到 III. dual representation 之前需要大概知道一下拉格朗日乘子法 (method of lagrange multiplier),它是用在有各种约束条件 (各种 "subject to") 下的目标函数,也就是直接可以求导可以引出 dual representation(怎么还没完摔)
稍微解释一下使用拉格朗日乘子法的直观理解,不作深入讨论

其中an>0是橙子(划去)乘子 [1]
可以这样想:(1) 我们的两个任务:①对参数最小化 L(解 SVM 要求),②对乘子又要最大化(拉格朗日乘子法要求), (2) 如果上面的约束条件成立,整个求和都是非负的,很好 L 是可以求最小值的;(3) 约束条件不成立,又要对乘子最大化,全身非负的 L 直接原地爆炸
好棒棒,所以解题一定要遵守基本法
① 先搞定第一个任务对 w,b 最小化 L
凸优化直接取导 => 志玲(划去)置零,得到:


② 第二个任务对 a 最大化 L,就是 dual representation 了
稍微借用刚刚数学表达里面的内容看个有趣的东西:
还记得我们怎么预测一个新的水果是苹果还是香蕉吗?我们代入到分界的直线里,然后通过符号来判断。
刚刚 w 已经被表达出来了也就是说这个直线现在变成了:
看似仿佛用到了所有的训练水果,但是其中an=0的水果都没有起到作用,剩下的就是小部分靠边边的 Support vectors 呀。
III. dual representation
把①的结果代回去就可以得到 [1]:


如果香蕉和苹果不能用直线分割呢?

Kernel trick.
其实用直线分割的时候我们已经使用了 kernel,那就是线性 kernel,
如果要替换 kernel 那么把目标函数里面的内积全部替换成新的 kernel function 就好了,就是这么简单。
高票答案武侠大师的比喻已经说得很直观了,低维非线性的分界线其实在高维是可以线性分割的,可以理解为——『你们是虫子!』分得开个 p...(大雾)
如果香蕉和苹果有交集呢?

松弛变量

松弛变量允许错误的分类,但是要付出代价。图中以苹果为例,错误分类的苹果ξ>1;在 margin 当中但是正确分类的苹果0<ξ<1;正确分类并且在 margin 外面的苹果ξ=0。可以看出每一个数据都有一一对应的惩罚。
对于这一次整体的惩罚力度,要另外使用一个超参数 v(Y) 来衡量这一次分类的 penalty 程度。
从新的目标函数里可见一斑 [1]:
(约束条件略)
如果还有梨呢?

可以每个类别做一次 SVM:是苹果还是不是苹果?是香蕉还是不是香蕉?是梨子还是不是梨子?从中选出可能性最大的。这是 one-versus-the-rest approach。
也可以两两做一次 SVM:是苹果还是香蕉?是香蕉还是梨子?是梨子还是苹果?最后三个分类器投票决定。这是 one-versus-one approace。
但这其实都多多少少有问题,比如苹果特别多,香蕉特别少,我就无脑判断为苹果也不会错太多;多个分类器要放到一个台面上,万一他们的 scale 没有在一个台面上也未可知。
这时候我们再回过头看一下思维导图划一下重点:

网友评论