我为2类svm分类器编写了代码,现在我想将它扩展到4类。
我有4门课和一些训练和测试的数据。我为这个分类尝试了很多MATLAB代码,但是我不知道如何将我的代码扩展到4类。我应该用matlab做这个工作,而不是像LIbsvm、svmlight或labview这样的程序.
请在这个过程中帮助我。
trainingdata = mydata
classes =[0;0;0;0;1;1;1;1;2;2;2;2;3;3;3;3]
[train, test] = crossvalind('holdOut',classes);
cp = classperf(classes);
svmStruct = svmtrain(data(train,:),groups(train),...
'showplot',true,'boxconstraint',1e6);
classes = svmclassify(svmStruct,data(test,:),'showplot',true);
classperf(cp,classes,test);发布于 2015-09-14 21:42:34
假设您有M类(在本例中为M=4)、trainingData和trainingLabels。有两种可能的备选方案(如评论中所指出的):a) 1-vs-all b) 1-vs-1
由于您只需要使用matlab svm,我建议使用1-vs-1方法。原因是but分类函数不返回分数,而只返回预测的类。如果您需要使用1-vs-all,您可以看到以下文章:如何在MATLAB中找到SVM分类器的得分?。
下面,我假设你继续进行1-vs-1。要理解它,请阅读幻灯片3:https://www.sec.in.tum.de/assets/lehre/ws0910/ml/slideslecture9.pdf
简单地说,这是的培训:
你训练M*(M-1)/2二进制支持向量机分类器。在你的例子中,它是6个分类器,比较了类别1-vs-2,1-vs-3,1-vs-4,2-vs-3,2-vs-4和3-vs-4.注意,你不需要训练2-vs-1,因为它已经被1-vs-2覆盖了。在这个步骤中,您将需要使用正确的培训数据和标签来向svmtrain函数提供信息。例如,为了训练1-vs-2,您只需要这两个类的示例和标签。
您还需要将得到的6个分类器存储在一个很好的数据结构中。最简单的是multiModel{classA}{classB}。
--这是对未知查询向量的测试:
1)初始化一个投票向量票=零(M,1);以保留每个类别的选票。
2)用所有6个二进制分类器对查询向量进行分类。根据结果,您可以将选票(WinnerClassID)=选票(WinnerClassID)+1,例如,假设您得到以下二进制分类结果: 1-vs-2: 2-vs-3: 1-vs-4: 1-vs-3: 2-vs-4: 2-vs-4:2-vs-4:1 0。
3)最大票数类是查询向量的最终预测标签。在上面的例子中:由于2级有最高票数(3票),多类svm的结果是标签2。
发布于 2015-12-28 14:30:53
LIBSVM和LIBLINEAR是两个流行的开源机器学习库,它们都是在台大开发的,都是用C++编写的,不过都是用C编写的。LIBSVM实现了核化支持向量机(SVM)的SMO算法,支持分类和回归。但是,您也可以在matlab中实现它们,它们会给您一些mex代码,可以根据您的需要来分类。您可以从下面下载工具箱:https://github.com/cjlin1/libsvm http://www.csie.ntu.edu.tw/~cjlin/libsvm/
最近,我发现了一种新的方法DSVM,从elow链接下载并测试它:在这里输入链接描述。
https://stackoverflow.com/questions/32546612
复制相似问题