SVM多类分类方法
![此博文包含图片](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
下节内容来自:http://blog.sina.com.cn/s/blog_5eef0840010147pa.html
SVM多类分类方法的实现根据其指导思想大致有两种:
(1)将多类问题分解为一系列SVM可直接求解的两类问题,基于这一系列SVM求解结果得出最终判别结果。
(2)通过对前面所述支持向量分类机中的原始最优化问题的适当改变,使得它能同时计算出所有多类分类决策函数,从而“一次性”地实现多类分类。原始问题可以改写为:
虽然第(2)种指导思想看起来简单,但由于它的最优化问题求解过程太复杂,计算量太大,实现起来比较困难,因此未被广泛应用[7]。而基于第(1)种指导思想的SVM多类分类方法主要有5种。
***1、一对其余法
**2、一对一
**3、DAG方法(有向无环图)
DAG-SVMS简单易行,只需要使用k一1个决策函数即可得出结果,较“一对一"方法提高了测试速度,而且不存在误分、拒分区域;另外,由于其特殊的结构,故有一定的容错性,分类精度较一般的二叉树方法高。然而,由于存在自上而下的“误差积累”现象是层次结构固有弊端,故DAG-SVMS也逃脱不掉。即如果在某个结点上发生了分类错误,则会把分类错误延续到该结点的后续结点上.
**4、决策树方法
**5、纠错输出编码法(ECOC)
对于K类分类问题,可以根据不同方法构造一系列的两类分类问题,对于每个两类分类问题可以建立一决策函数。共得到L个决策函数,如果这些决策函数完全正确,K类中的每一类都对应一个元素为-l或+1的长度为L的数
列,按照K类中的第一类、第二类,...,第K类的顺序,把这些数列排列起来,便可得到一个K行L列的编码矩阵,若要判断一个测试输入点的归属,首先用所得到的L个决策函数,得到一个元素为-l或l的长度为L的数列,然后将此数列与先前得到矩阵比较,相应于矩阵中有一行且仅有一行向与此数列相同,这个行数就是输入点的归属类;若矩阵中没有一行与该数列相同,可以通过计算汉明距离找出最近的一行,改行对应的类别即为该点的类别。
下节内容来自http://www.matlabsky.com/thread-9471-1-1.html
SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。
a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得 票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。
对c和d两种方法的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(计算机工程与应用。2004)
d.其他多类分类方法。除了以上几种方法外,还有有向无环图SVM(Directed Acyclic Graph SVMs,简称DAG-SVMs)和对类别进行二进制编码的纠错编码SVMs。
下节内容来自:http://blog.sina.com.cn/s/blog_4c98b96001009b8d.html
SVM多类分类---多个二值分类combine
SVM 算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目 标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较 高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。
a.一对多法(one-versus-rest,简称OVR SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
假如我有四类要划分(也就是4个Label),他们是A、B、C、D。于是我在抽取训练集的时候,分 别抽取A所对应的向量作为正集,B,C,D所对应的向量作为负集;B所对应的向量作为正集,A,C,D所对应的向量作为负集;C所对应的向量作为正集, A,B,D所对应的向量作为负集;D所对应的向量作为正集,A,B,C所对应的向量作为负集,这四个训练集分别进行训练,然后的得到四个训练结果文件,在 测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试,最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x).于是最终 的结果便是这四个值中最大的一个。
yode:这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased.因而不是很实用.
b.一对一法(one-versus-one,简称OVO SVMs或者pairwise)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得 票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
还是假设有四类A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。
投票是这样的.
A=B=C=D=0;
(A, B)-classifier 如果是A win,则A=A+1;otherwise,B=B+1;
(A,C)-classifer 如果是A win,则A=A+1;otherwise, C=C+1;
...
(C,D)-classifer 如果是A win,则C=C+1;otherwise,D=D+1;
The decision is the Max(A,B,C,D)
yode:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的.
c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。
对c的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(计算机工程与应用。2004)
d.DAG-SVMS是由Platt提出的决策导向的循环图DDAG导出的,是针对“一对一”SVMS存在误分、拒分现象提出的。 算法在训练阶段与“一对一”法同,也要构 每 两类间的分类面,既有n(n-1)/2个分类器。但在分类阶段,该方法将所有分类器构成一个两 向有向 环图,包括n(n-1)/2个节点和n个叶。其中每个节点为一个分类器,并与下一层的 两个节点(或叶)相连。当对一个未知 本进行分类时,首先从顶部的 节点(包含两类)开始, 据 节点的分类结果用下一层的左节点或右节点继续分类,直到达到底层某个叶为 止,该叶所表示类别即为未知 本的类别 DAGSVM在训练上同OVOSVM,都需要训练n*(n-1)/2个分类器,但是在分类的时候借助 有向 环图的结构,可以只利用(n-1)个分类器就可以完成。 而效率上有提升。![]()
下节内容来自:http://www.ilovematlab.cn/thread-84377-1-1.html
Matlab的LSSVM多分类问题
在lssvm工具箱中编程,解决分五类的问题。 经过样本训练,所得分类图形如附件所示,请问如何分辨该模型是否正确? %**********输入样本数据***********% X为250行5列的矩阵,Y为250行1列的矩阵(Y元素为1/2/3/4/5) %***************编码********************% [Yc,codebook,old_codebook] = code(Y,'code_MOC'); %**************调整参数******************% type = 'classification'; L_fold = 10; [gam,sig2] = tunelssvm({X,Yc,type,1,1,'RBF_kernel'},[],... 'gridsearch',{},'crossvalidate',{X,Yc,L_fold,'misclass'}); [alpha,b] = trainlssvm({X,Yc,type,gam,sig2,'RBF_kernel'}); %*************显示分类模型*************% plotlssvm({X,Yc,type,gam,sig2,'RBF_kernel'},{alpha,b}); |