libsvm中的多类分类
classification
libsvm
machine-learning
matlab
5
0

我正在使用libsvm,并且必须对具有一对一的所有类实施分类。

我该怎么做?
libsvm 2011版是否使用此功能?


我认为我的问题不是很清楚。如果libsvm不自动使用一个vs所有,我将为每个类使用一个svm,否则如何在svmtrain函数中定义此参数。我已经阅读了libsvm的自述文件。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

根据官方的libsvm 文档 (第7节):

LIBSVM为多类分类实现了“一对一”方法。如果k是类别数,则构造k(k-1)/2分类器,每个分类器训练来自两个类别的数据。

在分类中,我们使用一种投票策略:每个二进制分类都被认为是一种投票,可以对所有数据点x进行投票-最终,将一个点指定为投票数最多的类别。

在“ 一无所有”方法中,我们建立的分类器数量和分类数一样多,每个分类器都经过训练可以将一个分类与其他分类分开。为了预测新实例,我们选择决策函数值最大的分类器。


正如我之前提到的,其想法是训练k SVM模型,每个模型将一个类别与其他类别分开。一旦有了这些二进制分类器,就可以使用概率输出( -b 1选项),通过选择概率最高的类来预测新实例。

考虑以下示例:

%# Fisher Iris dataset
load fisheriris
[~,~,labels] = unique(species);   %# labels: 1/2/3
data = zscore(meas);              %# scale features
numInst = size(data,1);
numLabels = max(labels);

%# split training/testing
idx = randperm(numInst);
numTrain = 100; numTest = numInst - numTrain;
trainData = data(idx(1:numTrain),:);  testData = data(idx(numTrain+1:end),:);
trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end));

这是我针对多类SVM的一种“万事通”方法的实现:

%# train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
    model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
end

%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
    [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
    prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
end

%# predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == testLabel) ./ numel(testLabel)    %# accuracy
C = confusionmat(testLabel, pred)                   %# confusion matrix
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号