现在的位置: 首页 > 综合 > 正文

关于svm

2012年01月22日 ⁄ 综合 ⁄ 共 4844字 ⁄ 字号 评论关闭

名词解释:

(1) SVM(Support Vector Machine)是从瓦普尼克(Vapnik)的统计学习理论发展而来的,主要针对小样本数据进行学习、分类和预测(有时也叫回归)的一种方法,能解决神经网络不能解决的过学习问题。作者以为,类似的根据样本进行学习的方法还有基于案例的推理(Case-Based Reasoning),决策树归纳算法C4.5等,以后将详细阐述这两种方法。

(2)过学习问题:训练误差过小导致推广能力下降,即真实风险的增加。

(3)推广能力:generalization ability,也可以说是泛化能力,就是对未知样本进行预测时的精确度。

原文:A practical guide to support vector classification.

libsvm中的样本预处理的原则有2个:

1 非数值属性(Categorical Feature)

     由于SVM要求被处理的数据都是实数,因此对于属性值为类别的属性要进行转换。例如{red, green, blue},可以转换成3个属性
red    (1, 0, 0)
green  (0, 1, 0)
blue   (0, 0, 1)
来表示。经验表明当这样的非数值属性的取值不是太多(这个具体数字不明确)的时候,这种编码比用一个数字来表示属性的类别要稳定的多,比如用1, 2, 3来分别表示red, green, blue就不太合适了。目前,这个过程没有实现自动处理,需要使用者根据属性取值的多少自己动手去修改。

2 缩放(scaling)
    进行缩放的原因和使用神经网络时的考虑是一样的,由于RBF网络中采用样本数据的欧式距离来计算。主要优点就是避免数值范围较大的属性控制数值范围较小的属性。另一个优点就是避免计算时的numerical difficulties. 因为核值通常依赖特征向量的内积(inner product),而较大的属性值可能导致numerical问题。因此推荐把每个属性缩放到[-1, 1]或者[0, 1]之间,而且前一个范围要比后一个好,即对列向量进行规范化,其详细解释和计算公式见http://www.faqs.org/faqs/ai-faq/neural-nets/part2/中的“Should I standardize the input variables (column vectors)?”。libsvm中没有考虑属性的类型(效益、成本、固定、偏离、区间、偏离区间 6 种不同的属性类型的规范化计算公式是不一样的,详见:徐泽水,《不确定多属性决策方法及应用》,清华大学出版社,2004。)而采用了统一的线性缩放,作者以为此处可以改进一下。
    需要注意的是,在进行测试之前,要对测试数据进行同样的缩放操作。其实在libsvm中有程序(svmscale.exe)来进行缩放操作,也可以不用手工缩放,只要用easy.py来对(经过非数值的归一化处理之后的)原始数据直接操作即可。
    上面这两种方法基本上可以完成所有的样本的预处理了。其实只有原则 1 是需要自己手工改动的,其他工作在libsvm中的tool文件夹下都由现成的python程序处理。
  
“推广能力”是分类问题(classification,也称为模式识别问题,在概率统计中则称为判别分析问题)的一个指标。所谓推广就是在求得决策函数f(x)后,对一个新的输入x,按照y=f(x)推断出x相应的输出y。“推广能力”就是描述推广优劣的一种度量。
那么,决策函数f(x)是怎么回事?这要从分类问题的(数学语言描述的)定义说起,参见(邓乃扬等人的《数据挖掘中的新方法——支持向量机》,科学出版社,2005)。通俗的讲。就是一个表示x,y之间关系的函数,而x,y就是样本中的一对数据。其中x代表输入,y代表类别。分类问题就是找到这个决策函数f(x),而对于新的输入x,能够判断其所属类别y则是个预测(回归)问题。

 

名词解释1——支持向量机:“机(machine,机器)”实际上是一个算法。在机器学习领域,常把一些算法看作是一个机器(又叫学习机器,或预测函数,或学习函数)。“支持向量”则是指训练集中的某些训练点的输入 xi 。它是一种有监督(有导师)学习方法,即已知训练点的类别,求训练点和类别之间的对应关系,以便将训练集按照类别分开,或者是预测新的训练点所对应的类别。

 

名词解释2——符号函数:sgn(a) = 1, a >= 0;sgn(a) = -1, a < 0.

 

一般地,考虑 n 维空间上的分类问题,它包含 n 个指标和 l 个样本点。记这 l 个样本点的集合为 T = {(x1,y1),...,(xl,yl)},其中 xi 是输入指标向量,或称输入,或称模式,其分量称为特征,或属性,或输入指标;yi 是输出指标向量,或称输出,i = 1,...,l。 这 l 个样本点组成的集合称为训练集,所以我们也称样本点位训练点

 

对于训练集来说,有线性可分、近似线性可分和线性不可分等三种情况,这就是分类问题的三种类型。其实,无论是哪类问题,都有对应的分类机,这将在以下的内容中进行详细阐述。那么,有人可能会问,什么叫线性可分?通俗地讲,就是可以用一条或几条直线把属于不同类别的样本点分开。实际上,求解分类问题,就是要求出这条或这几条直线!那么,问题是:怎么求?这里先以二维两类线性可分的分类问题为例,做个详细的说明,然后再过渡到多类分类问题。

 

首先,回忆一下平面(二维)坐标系中某条直线的方程。还记得直线的一般方程

Ax + By + C = 0 (公式一)

吧,我们引入向量的概念,则该方程可以写成{x,y}与{A,B}的内积加上C等于0,即

{A,B}·{x,y} + C = 0

你还记得法向量和方向向量的概念吗?其实{A,B}就是法向量,而{B,-A}就是方向向量了。那么我们可以把直线的一般方程简化成为

w·x + b = 0 (公式二)

的形式(因为这个式子是大家最常用的嘛)。注意:(公式二)中的 x 和(公式一)中的 x 不同,前者一个二维向量,后者是一个实数。

 

对于两类问题,如果将某一直线两侧的样本点分为正类和负类,则用符号函数的方式推断点 x 所对应的类别 y 的决策函数如下:

y  = f(x) = sgn((w·x) + b) (公式三)

根据符号函数的定义,很明显 y 的取值要么是 1 ,要么是 -1,也就是说样本点的类别只有 1 和 -1 两类。此时的分类问题是:对于任意给定的一个新的模式 x ,根据训练集推断它所对应的输出 y 是 1 还是 -1。这就是线性可分的分类问题,也是一个模式识别问题,我们要做的工作就是要求出 w 和 b 。

 

直接求这两个参数基本上不太可能,除了训练集我们又没有别的信息可以利用,这可如何是好?前辈们给出了一个绝妙的方法——就是所求得的预测函数 f(x) 对原有样本的分类错误率最小。那么,问题又出来了,这个错误率咋算?损失函数就是专门用来评价预测准确程度的一种度量,而且模式识别问题使用的正是“0-1损失函数”。根据我的上一篇学习体会——《从机器学习到支持向量机》http://axywestwind.bokee.com/viewdiary.14525093.html中的阐述,使(公式三)中的 f(x) 的预测误差最小的问题转化成期望误差最小、经验风险最小,最后在统计学习理论中又转化为结构风险最小(Structural Risk Minimization, SRM)。而实现SRM的思路之一就是设计预测函数集的某种结构使每个子集中都能取得最小的经验风险(如使训练误差为0),然后只需选择适当的子集使置信范围最小,则这个子集中使经验风险最小的函数就是最优函数。SVM方法实际上就是这种思想的具体实现,它是对SRM的近似。说了半天,终于和上次的内容连接上了。但是,为了求解SRM这个最小化问题,还得将它转化成数学形式。

 

SVM方法是从线性可分情况下的最优分类面提出的,它是实现统计学习理论思想的方法。什么是最优分类面呢?这要从最优分类线说起。所谓最优分类线就是要求分类线不但能将两类无错误地分开,而且要使两类的分类间隔最大。前者是保证经验风险最小(如使训练误差为0),而使分类间隔最大实际上就是使推广性的界中的置信范围最小,从而使真实风险最小。推广到高维空间,最优分类线就成为最优分类面。

 

那么如何构造这个最优分类面呢?方法有 2 个:平分最近点法最大间隔法。有趣的是,这两个方法殊途同归,它们求解得到的是同一个超平面(由三个定理联合起来证明了这个结论)。由这三个定理可知,这两个方法与一个最优化问题求解方法等价,这个方法就称为“线性可分支持向量分类机”。其实,这个分类机是将最大间隔法求解最优分类面的最优化问题转化为其对偶问题,从而通过求解相对简单的对偶问题来求解原分类问题的算法。随后引入松弛变量惩罚因子来解决非线性分类问题,并且允许一定的分类错误(软间隔),最终得到非线性软间隔的标准的 C-支持向量机(C-SVC)。其中的巧妙之处就在于把一个复杂的最优化问题的求解简化为对原有样本数据的内积运算。我们要做的就是选择适当的核函数及其参数、惩罚因子就可以了。

 

概括地说,SVM就是首先通过用内积函数定义的非线性变换将输入空间变换到一个高维空间,然后再在这个空间中求(广义)最优分类面的分类方法。

 

svm处理流程:

  1. 收集数据,相关性分析(p卡方检验),特征选择(主成份分析)。
  2. 归一化数据。就是根据实际要求,将数据的取值范围转化为统一的区间如[a,b],a,b为整数。方法参考:http://slt-ml.blogspot.com/2008/06/spss.html
  3. 利用抽样技术将数据集分为训练集和测试集。抽样技术有分层抽样,简单抽样(等概率抽样)
  4. 将数据转化为软件(接口)所支持的格式。就libsvm(c++,java)来说,我们可以使用FormatDataLibsvm.xls将数据转化为libsvmm所要求的格式。参考:http://slt-ml.blogspot.com/2008/06/formatdatalibsvmxlslibsvm.html
  5. 选择核函数,可以优先考虑rbf。
  6. 训练集利用交叉验证法选择最好的参数C和r(rbf核函数中的参数gama)。可以通过网格法寻找出最优的参数,注意一次交叉验证得到一个参数对所对应的模型精度,网格法目的就是找到使得模型精度达到对高的参数对(这里的参数对可能不止两个,有可能也有其他的),可以使用一些启发式的搜索来降低复杂度,虽然这个方法笨了点,但是它能得到很稳定的搜索结果。需要提到的这里在对训练集进行分割的时候涉及到抽样,一个较好的方法就是分层抽样。从这步可以看出其实 Cross-Validation是一种评估算法的方法。
  7. 用6中得到的参数对在整个训练集合上进行训练,从而得出模型。
  8. 利用测试集测试模型,得到精度。这个精度可以认为是模型最终的精度。当然有人会担心3步中抽样会有一定的误差,导致8得到的精度不一定是最好的,因此可以重复3-8得到多个模型的精度,然后选择最好的一个精度最为模型的精度(或者求所有精度的均值做为模型精度)。

     svm主要做分类或者回归的.以分类为例,一般情况下,数据不是线性可分的,因此如果要分类非线性数据,就必须将数据映射为线性可分的空间,但是这会伴随着数据维数的增加,甚至会到无穷的情况.那这样就没法计算了.幸亏svm的特点决定了并不需要考虑数据的维数,它的相关计算只与两个数据的内积有关,当数据映射到高维空间后,需要计算数据的内积,但是又不知道映射函数以及数据的具体维数时.核函数很好的解决了这个矛盾,它使计算高维空间的内积转换为在原来空间数据点的核函数计算.可以这样理解,核函数就是高维空间数据点的内积,但它的计算是原来空间计算的.这个特点是svm成功的基础,也是svm的核心内容,相当的完美.要真正理解这个概念,需要一些泛函的知识,但是开始的时候你无须知道所有细节,什么mercer条件你都不要管.现在研究的核函数只有那么几种,先用他们再说.

抱歉!评论已关闭.