前面我们讲过,对如下的原始的优化问题我们希望找到一个优化的边界分类器。
从图上可以看出,离分界线最近的点他们的边界最小,图上有三个点,分布在分界线两边的虚线上,因此,只有这三个 αi —换句话说,只有这三个点对应的 αi —是非零的,这三个点称为\textbf{支持向量},这也说明为什么支持向量的数量只占总样本数的一小部分。这也是支持向量机的由来,这种分类器只会用到训练样本中的支持向量,其它的训练样本并不起作用。
我们继续往下看,因为之前我们讨论了这个优化问题的对偶形式,需要注意的关键一点是,我们将利用样本之间的内积 <x(i),x(j)> 来解决这个优化问题。
我们利用向量内积这一点,也正是稍后介绍kernel函数的关键。
我们对该优化问题建立拉格朗日表达式,我们可以得到:
将w的偏导数式-(2)代入拉格朗日表达式式-(1),简化后可以得到:
接下来,我们要介绍支持向量机中的kernel的概念,利用kernel,可以方便地处理高维甚至无穷多维的特征向量。我们先定义几个概念,我们称训练样本的原始数值为attributes (属性),而经过映射之后得到的新的数值称为features (特征),我们定义函数 ϕ 为feature mapping (特征映射),特征映射就是将训练样本的原始数值映射到新的数值。
我们使用SVM的时候,可能不想使用训练样本的原始数值x,我们想利用一些新的特征 ϕ(x) ,这个对SVM的优化问题没有造成任何影响,我们只需要将前面式子里的x,换成 ϕ(x) 就行了。
既然SVM的算法,可以表示所有的训练样本的内积 <x,z> ,意味着我们只要将所有的内积替换成: <ϕ(x),ϕ(z)> 。特别地,给定一个特征映射 ϕ ,我们定义相应的kernel 为
现在,给定特征映射 ϕ ,我们可以先找到特征 ϕ(x),ϕ(z) ,然后通过求两个特征向量的内积可以很容易得到 k(x,z) ,但是更有趣的是,一般来说 k(x,z) 的运算要比特征 ϕ(x),ϕ(z) 的运算更加高效,这样,我们可以利用SVM在特征映射 ϕ 得到的特征空间里直接计算,而不用计算特征向量 ϕ(x) 。
现在,我们从另外一个稍微不同的角度来看这个kernel,直观上,如果 ϕ(x),ϕ(z) 比较靠近,我们希望 k(x,z)=ϕ(x)Tϕ(z) 是一个比较大的值,相反地,如果 ϕ(x),ϕ(z) 离得比较远,那么我们希望 k(x,z)=ϕ(x)Tϕ(z) 的值会比较小,所以我们希望 k(x,z) 可以用来衡量 ϕ(x),ϕ(z) 的相似程度,或者说x,z的相似程度。
考虑到这一点,一个比较合理的kernel函数可以是高斯函数,
一个有效的kernel应该具备某些性质,现在假设k对于特征映射 ϕ 来说是一个合理的kernel,考虑有限的m个点, {x(1),...x(m)} ,我们定义一个 m×m 的方阵K,方阵K中的元素为: Kij=k(x(i),x(j)) ,这个矩阵称为kernel matrix。
如果k是一个合理的kernel,那么, Kij=k(x(i),x(j))=ϕ(x(i))Tϕ(x(j))=ϕ(x(j))Tϕ(x(i))=k(x(j),x(i))=Kji ,因此,K一定是对称的,更进一步,假设 ϕk(x) 表示特征向量 ϕ(x) 的第k个分量,我们发现,对于任何的向量z,存在以下的关系:
Marcer定理:假设kernel k满足映射关系 Rn×Rn→R ,那么如果kernel k是一个合理的kernel,对于任意的有限的一组点 {x(1),...x(m)} ,其对应的kernel 矩阵必须是对称半正定的。
将kernel应用到SVM,其好处是显而易见的,不过我们需要意识到,kernel的概念不仅仅可以用在SVM上,换句话说,如果一个学习算法需要用到输入向量的内积,即 <x,z> ,那么这个算法就可以利用kernel,今后我们会介绍到的一些算法都可以利用kernel,这个可以称为kernel trick。
Andrew Ng, “Machine Learning”, Stanford University.