说说SVM的基础知识(1)

1. 导言

在机器学习和模式识别领域,SVM绝对是除了Boosting之外的又一项重大突破,在一般的应用中,我们都用LibSVM这样已经成熟的库,但是对于内部机理和一些基础知识我们可能很多时候并不清楚,那么我们就把一些基础的知识一点点说清。

 

2. 关于维度

首先,我们来说下维度。

维度这个概念我们都并不陌生,维度在数学中也称作维数,代表的是参数的数目。我们说零维是点,一维是线,二维是面,三维是立体。

我们跳出数学的视角,而上升到哲学的角度,我们说维度其实代表的是我们看一件事物的视角,每个视角都有着一个对应的描述,于是我们将这个描述数字化,并且将这些视角的描述综合起来,放到一起,我们将之成为多维向量。例如说,我们审视一个长方体,需要看他的长度,高度,宽度,重量,那么我们用多维向量来描述这个长方体便可能是 < 1,1,2,4 >,这里面我们引入了4个维度,我们把它叫做四维向量。

在数据挖掘领域,我们经常会碰到多维的概念,例如我们把一个电影条目看做一个事物,而把不同用户对他的评价作为该电影的不同维度,那么这个电影可能会有着几万,甚至几十万维的维度。那么我举一个实际的业务场景,在很多网站都有着喜欢这个商品的用户也喜欢,那么在这里,我们把它转换成 喜欢这个电影的人也喜欢,最简单的方法就是最一个简单的cosine - similarity:

NewImage

 

这里我们要理解一个常识性的概念,叫做维度灾难。维度灾难通常都被用作是不要处理高维数据的最好借口。维度灾难通常是指在高维空间中,所有的数据都很稀疏,于是导致在相似度度量上,距离计算上都会出现很大的偏差,因为平时我们采用的算法也都会变得很低效。

那么我们针对上面的问题,我们需要对数据做一个降维处理。

 

3. PCA和SVD

PCA,也称主成份分析,是一种非常常见的降维算法。简单来说,PCA是一种将高维的数据映射到较低维度的一种方法。

换做数学化的定义来说,就是通过一个正交化的线性变换,把原有的数据变换到一个新的坐标系统中,使这些数据的最大方差维度落在第一坐标上,称之为第一主成份。接下来是第二主成份,等等。

NewImage

 

这是一张最经典的PCA的图,这里我们并不具体谈实现的算法。

SVD几乎是降维领域最常使用的技术了,我们通过将一个矩阵拆分成三个小矩阵相乘的形式:

NewImage

从而得到降维之后的结果。

那么接下来,我们则可以利用item 在不同维度上的投影来继续利用cosine similarity或者其他的相似度度量方式来计算两部电影的相似度了。

 

4.  升维

既然我们之前介绍了维度灾难,也介绍了很多PCA和SVD两种降维的技术,那为什么这里又要讨论升维呢?

在很多的情况下,线性的分类器无法达到让我们满意的效果,那么我们通常会采用两种方案:

A. 结合多个线性分类器来组合成一个非线性的分类器,例如Boosting方法,就是这种思想的体现。

B. 首先对数据做一个非线性的变换,将x映射到一个不同的空间。典型的方法就是SVM。

这里我们看一个例子:

NewImage

例如我们现在有这样的一组数据,空心和实心分别代表两类数据,我们现在需要对这组数据来做分类。很明显,这组数据不是线性可分的。那么我们试想将这组二维数据上的平面投射到三维,甚至更高维的空间上时,我们则可以利用一个“超平面”将之分开:

NewImage

我没有对这个图做加工,其实这里的红色的线,应该是一个超平面,也就是一个N维的平面,大家可以自己设想一下。在CSDN上有一个例子更为容易理解:

NewImage

这里的红色线和黑色线分别代表数据的两类,这是一个一维的数据,这是一个非线性可分的,然后我们升为了二维,就变成了一个类似于抛物线的结构,这里你可以理解把这个直线做了弯曲,那么这个时候就成了线性可分的,这个例子就相当于我们把数据从一维升到了二维。

我们来换个角度思考,如果给你一堆物品,人脑是如何对这些物品进行分类,依然是找出这些物品的一些特征,例如:颜色,形状,大小,触感等等,然后根据这些特征对物品做以归类,这其实就是一个先升维,后划分的过程。

 

5 . Kernal Method

上一节我们说到在SVM中,需要对数据做一个升维的处理,这正是Kernel Method处理非线性的问题的整体思想。

那么首先我们就先定义一个映射 φ(x) 表示从低维映射到高维,然后在这个空间内通过线性的分类器对其分类。通过Repesenter Theorem可以证明,做了转换之后,在训练和测试分类器的时候,进行的仍然是两个点之间的点积运算。我们可以将之表达成:

NewImage 

 实在懒着打一堆公式了,还是手写把……...

IMG 0073

 

IMG 0074 

 

这里只做两点解释:

 

A. 很多觉得在最初的时候我已经得到了一个f(x) = wφ(x) 的表达式,那么我们就可以直接去优化求w,为什么还要费尽心思去优化到最后的一步呢? 这个问题就在于,如果我们定义一个很简单的核函数,我们可以解出phi。但是假设我们定一个高斯核,那么这个时候解出的是一个无穷多维,无论是从效率上还是从表示上,我们都没有办法来针对φ(x)来做专门的计算。

B. 在SVM中,每个kernel method都对应着一个变换,那么并不是说我们把数据根据phi函数去投射到一个新的空间上,数据就线性可分了,或者说采用这样的phi函数就会获得较好的效果和性能。那么如何采用核函数,只能利用实验来验证,但是传统上,一般来说采用高斯核有着较好的效果。

 

那么接下来,就把事情演变成了如何来构造核函数的问题,这个就在下篇文章中再来说把。

posted @ 2012-12-21 13:15  飞林沙  阅读(6520)  评论(5编辑  收藏  举报