55

在每本书和示例中,它们总是只显示二进制分类(两个类),并且新向量可以属于任何一个类。

这里的问题是我有 4 个类(c1、c2、c3、c4)。我有 4 个班级的训练数据。

对于新向量,输出应该是

C1 80%(获胜者)

c2 10%

c3 6%

c4 4%

这个怎么做?我打算使用 libsvm (因为它最流行)。我对此了解不多。如果你们中的任何人以前使用过它,请告诉我我应该使用的具体命令。

4

8 回答 8

41

LibSVM 使用一对一的方法来解决多类学习问题。从常见问题解答

问:libsvm 对多类 SVM 使用什么方法?你为什么不使用“1-against-the rest”的方法呢?

这是一对一的。我们在做了以下比较后选择了它:C.-W。许和 C.-J。林。多类支持向量机方法的比较,IEEE Transactions on Neural Networks,13(2002),415-425。

“1-against-the rest”是一种很好的方法,其性能可与“1-against-1”相媲美。我们做后者只是因为它的训练时间更短。

于 2011-02-23T08:50:01.907 回答
22

常用的方法是一对一休息和一对一。在第一种方法中,您得到 n 个分类器,结果类将获得最高分。在第二种方法中,结果类是通过所有分类器的多数票获得的。

AFAIR,libsvm 支持多类分类的两种策略。

于 2009-12-24T13:20:35.187 回答
6

您始终可以通过递归地选择类集的随机分区来将多类分类问题简化为二元问题。这不一定比一次学习更有效或效率更低,因为子学习问题需要更少的示例,因为分区问题更小。(它最多可能需要更多的恒定订购时间,例如两倍长)。它也可能导致更准确的学习。

我不一定推荐这个,但它是您问题的一个答案,并且是一种可以应用于任何二进制学习算法的通用技术。

于 2009-12-24T13:09:05.367 回答
1

使用 SVM 多类库。在Thorsten Joachims 的 SVM 页面上找到它

于 2011-12-02T20:07:41.273 回答
0

使用 SVM 进行多类分类;它不是(一对一)也不是(一对 REST)。

而是学习一个二类分类器,其中特征向量是 (x, y),其中 x 是数据,y 是与数据关联的正确标签。

训练差距是正确类的值与最近的其他类的值之间的差异。

在推理时,选择具有 (x,y) 最大值的“y”。

y = arg_max(y') W.(x,y') [W是权重向量,(x,y)是特征向量]

请访问链接: https ://nlp.stanford.edu/IR-book/html/htmledition/multiclass-svms-1.html#:~:text=It%20is%20also%20a%20simple,the%20label%20of %20structural%20SVMs%20

于 2020-06-17T12:41:31.690 回答
0

它没有用于多类预测的特定开关(命令)。如果您的训练数据集包含两个以上的类,它会自动处理多类预测。

于 2015-10-01T15:44:48.377 回答
0

与二进制预测相比没有什么特别的。有关基于 SVM 的 3 类预测,请参见以下示例。

install.packages("e1071")
library("e1071")
data(iris)
attach(iris)
## classification mode
# default with factor response:
model <- svm(Species ~ ., data = iris)
# alternatively the traditional interface:
x <- subset(iris, select = -Species)
y <- Species
model <- svm(x, y) 
print(model)
summary(model)
# test with train data
pred <- predict(model, x)
# (same as:)
pred <- fitted(model)
# Check accuracy:
table(pred, y)
# compute decision values and probabilities:
pred <- predict(model, x, decision.values = TRUE)
attr(pred, "decision.values")[1:4,]
# visualize (classes by color, SV by crosses):
plot(cmdscale(dist(iris[,-5])),
     col = as.integer(iris[,5]),
     pch = c("o","+")[1:150 %in% model$index + 1])
于 2016-07-25T18:10:02.937 回答
0
data=load('E:\dataset\scene_categories\all_dataset.mat');
    meas = data.all_dataset;
    species = data.dataset_label;
    [g gn] = grp2idx(species);                      %# nominal class to numeric

%# split training/testing sets
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/10);
%# 1-vs-1 pairwise models
num_labels = length(gn);
clear gn;
num_classifiers = num_labels*(num_labels-1)/2;
pairwise = zeros(num_classifiers ,2);
row_end = 0;
for i=1:num_labels - 1
    row_start = row_end + 1;
    row_end = row_start + num_labels - i -1;
    pairwise(row_start : row_end, 1) = i;
    count = 0;
    for j = i+1 : num_labels        
        pairwise( row_start + count , 2) = j;
        count = count + 1;
    end    
end
clear row_start row_end count i j num_labels num_classifiers;
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
    svmModel{k} = svmtrain(meas(idx,:), g(idx), ...
                 'Autoscale',true, 'Showplot',false, 'Method','QP', ...
                 'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);

    %# test
    predTest(:,k) = svmclassify(svmModel{k}, 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)
于 2017-01-04T12:06:44.617 回答