支持向量机多类分类方法及特点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支持向量机多类分类方法及特点相关的知识,希望对你有一定的参考价值。
参考技术A 支持向量机是针对两类分类问题提出的,而在实际应用中多类分类问题更为普遍。如何将支持向量机的优良性能推广到多类分类一直是支持向量机研究中的重要内容,其对于类别数目较多的分类问题,目前仍缺乏有效的支持向量机多类分类方法。多类分类是机器学习领域中的重要问题,它的应用在现实生活中非常普遍,多类分类问题是对两类分类问题的推广。目前,支持向量机多类分类的方法主要包括两种:一是将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题实现多类分类;二是将多类分类问题分解成多个两类分类问题,然后再采用某种方法将多个两类分类器的输出组合在一起实现多类分类。下面对这些方法进行介绍:1)1− a − r 方法
对于k 类多类分类问题,1− a − r 方法需要构造k 个将其中一个类别与其它所有类别区分开的两类支持向量机分类器。分类时将未知样本分到具有最大分类决策函数值的类别中,即采用“最大输出法”将多个两类分类器的输出组合在一起实现多类分类。1− a − r 方法的分类示意图如图 4-2 所示,图中“·” 、“• ”和“★”分别代表三个不同的类别。
1− a − r 方法因简单易于实现而得到了广泛的应用,但是,它也存在许多缺点,这些缺点主要包括:(1)存在不可识别区域。如图 4-2 所示,区域“·” 、“• ”和“★” 为1− a − r 方法的可识别域,而“A” 、“B” 、“C” 、“D”区域是不可识别区域,它们的类型是未知的;(2)1− a − r 方法的每个支持向量机都是在全部训练样本上训练而成的,训练样本的重复训练率高,样本数目较多时,训练速度慢;(3)1− a − r 方法分类时需要计算每一个支持向量机分类器的决策函数值,分类的效率不高;(4)1− a − r 方法各个支持向量机的正例样本数目远远少于反例样本数目,而标准支持向量机分类时倾向于反例,使得所关注的正例的分类错误率反而较高。
2) 树型支持向量机多类分类方法
如图 4-3 所示,树型支持向量机的基本思想是从根节点开始,采用某种方法将该节点所包含的类别划分为两个子类,然后再对两个子类进一步划分,如此循环,直到子类中只包含一个类别为止。这样,就得到了一个倒立的二叉树。最后,在二叉树各决策节点训练支持向量机分类器,实现对待识别样本的分类。树型支持向量机多类分类方法的主要优点是需要训练的支持向量机数目和各支持向量机的训练样本数目都较少,并且分类时也不必遍历所有的支持向量机分类器,具有较高的训练速度和分类速度,对于类别数目多的分类问题,它的优势更为明显。
3)决策树支持向量机多分类器
分类问题(N > 2) 和二分类问题之间存在一定的对应关系:如果一个分类问题 N类可分,则这 N 类中的任何两类间一定可分;反之,在一个 N 分类问题中,如果我们己知其任意两两可分,则通过一定的组合法则,我们可由两两可分来最终实现 N 类可分。由于数型支持向量机在多分类问题的优越性,有学者将支持向量机和二叉决策树的基本思想结合起来构成多类别的分类器,称为 SVM 决策树方法。由二叉树的性质可知:对任何一棵二叉树,如果其叶子结点个数为 N0 ,度为 2 的结点个数为 N2 ,则有N0 = N2 +1而 SVM 决策树中没有度为 1 的结点,是一棵正则二叉树。设对 N 类样本构造一棵二叉决策树,则树的每个叶子结点对应一个类别,每个度为 2 的非叶子结点对应一个子 SVM 分类器。决策树共有2N −1个结点,叶子结点个数为 N ,子 SVM 分类器个数为 N −1。在“一对其余”的 SVM 多分类方法中,每一类的识别被看成一个独立的二分类问题(如图 4-4 所示)。拿本文研究的飞机目标为例,设所有飞机目标为 m 类,记为:L = a1 a2 Κ am 。设属于ai的飞机目标个数为 Ni ,以任何一类ai为例,训练正例是该类所包含的全部飞机目标,而反例是在训练集中不属于该类的所有其它类的飞机目标。即一类的正例总数为 Ni ,反例总数为
为类的集合,每一次区分类集合中的一类。fj(x) 为类的集合,每一次区分类集合中的一类。
图 4-4 决策树具有层次结构,以致各训练集合的构成不同,训练所用的例子累次降低,减少了训练时间,测试是按照层次完成。每次构造分类器时,优先选择训练样本数量最多的类别的训练数据作为当前分类器的训练正例,剩余类别的训练数据作为分类器的训练反例,构造最优决策树,从而可以迅速减少训练集的规模,进而提高训练效率。
一对一支持向量机多类分类matlab代码
【中文标题】一对一支持向量机多类分类matlab代码【英文标题】:one vs one svm multiclass classification matlab code 【发布时间】:2016-03-15 01:42:28 【问题描述】:这是我的一对一代码。此代码不是由@amro 编写的。我不明白为什么会这样。当我学习代码时,一切看起来都很简单。请帮我修复它。我正在使用 matlab2014a。
代码:一对一
%# load dataset
load fisheriris
[g gn] = grp2idx(species); %# nominal class to numeric
%# split training/testing sets
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/3);
pairwise = nchoosek(1:length(gn),2); %# 1-vs-1 pairwise models
svmModel = cell(size(pairwise,1),1); %# store binary-classifers
predTest = zeros(sum(testIdx),numel(svmModel)); %# store binary predictions
%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
%# get only training instances belonging to this pair
idx = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );
%# train
svmModelk = svmtrain(meas(idx,:), g(idx),'-s 0 -t 0');
%# test
predTest(:,k) = svmclassify(svmModelk, meas(testIdx,:));
end
pred = mode(predTest,2); %# voting: clasify as the class receiving most votes
%# performance
cmat = confusionmat(g(testIdx),pred);
acc = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)
错误:
Reference to non-existent field 'SupportVectors'.
Error in svmclassify (line 60)
if size(sample,2)~=size(svmStruct.SupportVectors,2)
Error in test_onevsone (line 21)
predTest(:,k) = svmclassify(svmModelk, meas(testIdx,:));
我也试试,svmModel1.SupportVectors
。看起来 SupportVectors 不是按结构返回的。
请有人修复这个错误... 谢谢...
【问题讨论】:
【参考方案1】:您的错误在第 18 行,svmModelk = svmtrain(meas(idx,:), g(idx),'-s 0 -t 0');
。
svmtrain 函数接受 2 + 2n 输入。正确的语法是:svmtrain(Training, Group)
或 svmtrain(Training, Group, Name, Value)
。名称和值是对参数。 Name 是参数名称,Value 是对应的值。您使用 '-s 0 -t'
作为第三个,这不是 matlab 参数名称!修复它并使用您的代码。
【讨论】:
以上是关于支持向量机多类分类方法及特点的主要内容,如果未能解决你的问题,请参考以下文章