2009-12-24 8 views
35

В каждой книге и примере всегда они показывают только двоичную классификацию (два класса), а новый вектор может принадлежать любому классу.Как сделать классификацию нескольких классов с использованием векторных машин поддержки (SVM)

Здесь проблема в том, что у меня есть 4 класса (c1, c2, c3, c4). Я тренирую данные для 4 классов.

Для нового вектора выход должен быть как

С1 80% (победитель)

с2 10%

с3 6%

с4 4%

Как сделать t его? Я планирую использовать libsvm (потому что он наиболее популярен). Я мало знаю об этом. Если кто-либо из вас, ребята, использовал его раньше, пожалуйста, скажите мне конкретные команды, которые я должен использовать.

ответ

3

Вы всегда можете уменьшить проблему классификации с несколькими классами до двоичной задачи, выбирая рекурсивные случайные разделители набора классов. Это не обязательно менее эффективно или эффективно, чем обучение всех сразу, так как проблемы суб-обучения требуют меньше примеров, поскольку проблема секционирования меньше. (Это может потребовать в большинстве случаев более длительного порядка, например, в два раза больше). Это может также привести к более точному обучению.

Я не обязательно рекомендую это, но это один ответ на ваш вопрос и является общей техникой, которая может быть применена к любому алгоритму двоичного обучения.

11

Общепринятые методы: «Один против покоя» и «один против одного». В первом случае вы получаете n классификаторов, а полученный класс с наивысшим счетом . Во втором классе результирующий класс получается большинством голосов всех классификаторов.

AFAIR, libsvm поддерживает обе стратегии мультикласса.

+3

Я думал libsvm поддерживает только один по сравнению с одним. Но все работает очень хорошо. –

30

LibSVM использует метод один против одного для многоуровневых проблем обучения. От FAQ:

Вопрос: Какой метод использует libsvm для многоуровневого SVM? Почему бы вам не использовать метод «1-против-остального»?

Это один против одного. Мы выбрали его после следующего сравнения: C.-W. Hsu и C.-J. Лин. A comparison of methods for multi-class support vector machines, IEEE Transactions на нейронных сетях, 13 (2002), 415-425.

«1-против-остальное» - хороший метод, производительность которого сопоставима с «1 против 1». Мы делаем последнее просто потому, что его время обучения короче.

0

У него нет специального ключа (команды) для прогнозирования с несколькими классами. он автоматически обрабатывает многоуровневое предсказание, если ваш набор учебных материалов содержит более двух классов.

0

Ничего особенного по сравнению с бинарным прогнозом.см. следующий пример для прогнозирования 3-х классов на основе 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]) 
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) 
+5

Вы можете добавить любое описание, чтобы помочь пользователю понять его? ваш ответ имеет меньшее значение, если это только код:/ – goto

+0

all_dataset.mat имеет 15 классов, я использую многоуровневую svm на основе построения ons против одного бинарного svm-классификатора. – lin0Xu