Machine learning 如何使用支持向量机(SVM)进行多类分类

Machine learning 如何使用支持向量机(SVM)进行多类分类,machine-learning,svm,libsvm,Machine Learning,Svm,Libsvm,在每本书和每一个例子中,它们总是只显示二进制分类(两个类),新向量可以属于任何一个类 这里的问题是我有4个类(c1,c2,c3,c4)。我有4节课的训练数据 对于新向量,输出应该如下 C1 80%(获胜者) c2 10% c3 6% c4 4% 如何做到这一点?我计划使用libsvm(因为它最流行)。我对它了解不多。如果你们中的任何人以前使用过它,请告诉我应该使用的特定命令。通过递归地选择类集合的随机分区,您总是可以将多类分类问题简化为二进制问题。这并不一定比一次性学习效果差,因为子学习问题需要

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

这里的问题是我有4个类(c1,c2,c3,c4)。我有4节课的训练数据

对于新向量,输出应该如下

C1 80%(获胜者)

c2 10%

c3 6%

c4 4%


如何做到这一点?我计划使用libsvm(因为它最流行)。我对它了解不多。如果你们中的任何人以前使用过它,请告诉我应该使用的特定命令。

通过递归地选择类集合的随机分区,您总是可以将多类分类问题简化为二进制问题。这并不一定比一次性学习效果差,因为子学习问题需要更少的示例,因为分区问题更小。(最多可能需要一个固定的订购时间,例如两倍的时间)。这也可能导致更准确的学习


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

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

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

libsvm使用一对一方法解决多类学习问题。从:

问:libsvm对多类SVM使用什么方法?你为什么不使用“1对其余”的方法呢

这是一对一。我们在做了以下比较后选择了它:许春华和林春杰,《神经网络上的IEEE交易》,13(2002),415-425

“1对1”是一种很好的方法,其性能与“1对1”相当。我们采用后者仅仅是因为它的训练时间较短


使用SVM多类库。在

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

与二进制预测相比,没有什么特别之处。基于SVM的三类预测见下例

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])
install.packages(“e1071”)
图书馆(“e1071”)
数据(iris)
附加(虹膜)
##分类模式
#因子响应的默认值:

支持向量机多类分类模型; 它不是(一对一)也不是(一对休息)

相反,学习两类分类器,其中特征向量是(x,y),其中x是数据,y是与数据关联的正确标签

培训差距是正确班级的值与最近的其他班级的值之间的差值

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

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

请浏览以下连结:
.

我以为libsvm只支持一对一。但它确实很好用。你能添加一些描述来帮助用户理解它吗?如果仅是代码,您的答案就没有那么重要:/all_dataset.mat有15个类,我使用基于构造ons的多分类svm,而不是一个二进制svm分类器。
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)