SVM实现多分类的三种方案

SVM本身是一个二值分类器

SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。

目前,构造SVM多类分类器的方法主要有两类

(1)直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;

(2)间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。

一对多法(one-versus-rest,简称OVR SVMs)

训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

假如我有四类要划分(也就是4个Label),他们是A、B、C、D。

于是我在抽取训练集的时候,分别抽取

(1)A所对应的向量作为正集,B,C,D所对应的向量作为负集;

(2)B所对应的向量作为正集,A,C,D所对应的向量作为负集;

(3)C所对应的向量作为正集,A,B,D所对应的向量作为负集;

(4)D所对应的向量作为正集,A,B,C所对应的向量作为负集;

使用这四个训练集分别进行训练,然后的得到四个训练结果文件。

在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。

最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。

于是最终的结果便是这四个值中最大的一个作为分类结果。

评价:

这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased.因而不是很实用。可以在抽取数据集的时候,从完整的负集中再抽取三分之一作为训练负集。

一对一法(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)-classifier 如果是A win,则A=A+1;otherwise, C=C+1;
  …
  (C,D)-classifier 如果是A win,则C=C+1;otherwise,D=D+1;
  The decision is the Max(A,B,C,D)

评价:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的。

层次支持向量机

层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。对层次支持向量机的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(刘志刚,计算机工程与应用,2004)

转载请注明本文地址:SVM实现多分类的三种方案

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多标签分类算法(multi-label classification)是指一个样本可以被分到多个类别中。经典的多标签分类算法包括k最近邻算法、支持向量机(SVM)和决策树等。下面介绍如何使用Matlab实现这些算法。 1. k最近邻算法 k最近邻算法(k-Nearest Neighbor, k-NN)是一种基于实例的学习方法,它通常被用来进行分类和回归。在多标签分类中,k-NN算法也可以直接应用。Matlab提供了knnsearch函数,可以用于搜索最近邻样本及其类别。通过计算每个样本的最近邻,可以预测该样本可能属于的多个类别。下面是一个MATLAB示例代码: % load data and labels load('traindata.mat'); load('trainlabel.mat'); % normalize data traindata = normalize(traindata); % set parameters k = 5; % number of neighbors % set up k-NN search [idx, dist] = knnsearch(traindata, traindata, 'K', k+1); % compute labels for testing data testlabel = zeros(size(traindata, 1), size(trainlabel, 2)); for i = 1:size(traindata, 1) % find nearest neighbors neighbors = idx(i, 2:end); % compute labels based on neighbors for j = 1:size(trainlabel, 2) testlabel(i,j) = mode(trainlabel(neighbors,j)); end end 2. 支持向量机 支持向量机(Support Vector Machine, SVM)是一种常用的监督学习算法,它可以用于分类和回归问题。在多标签分类中,SVM算法通常采用one-vs-all的方法进行扩展。Matlab中提供了fitcecoc函数,可以方便地实现多类别SVM分类器。下面是一个MATLAB示例代码: % load data and labels load('traindata.mat'); load('trainlabel.mat'); % normalize data traindata = normalize(traindata); % set parameters kernel = 'linear'; % kernel function boxconstraint = 1; % regularization parameter % train SVM classifiers svmmodel = fitcecoc(traindata, trainlabel, 'KernelFunction', kernel, ... 'BoxConstraint', boxconstraint); % predict labels for testing data testlabel = predict(svmmodel, testdata); 3. 决策树 决策树是一种基于树形结构的分类模型。在多标签分类中,可以使用决策树同时预测多个标签。Matlab提供了fitctree函数,可以用于构建分类决策树。下面是一个MATLAB示例代码: % load data and labels load('traindata.mat'); load('trainlabel.mat'); % normalize data traindata = normalize(traindata); % set parameters minleaf = 5; % minimum number of leaf nodes % train decision tree classifiers tree = fitctree(traindata, trainlabel, 'MinLeaf', minleaf); % predict labels for testing data testlabel = predict(tree, testdata); 以上三种算法的MATLAB实现,均需要准备好数据集和相应的标签,并设置好各个参数。通过实现这些算法,可以为多标签分类问题提供有效的解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值