Подтвердить что ты не робот

Как сделать классификацию нескольких классов с помощью поддерживающих векторных машин (SVM)

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

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

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

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

c2 10%

c3 6%

c4 4%

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

4b9b3361

Ответ 1

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

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

Это один против одного. Мы выбрали его после следующего сравнения: C.-W. Hsu и C.-J. Лин. Сравнение методов для многокомпонентных векторных машин, IEEE Transactions on Neural Networks, 13 (2002), 415-425.

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

Ответ 2

Обычно используемые методы - это "против против" и "один против одного". В первом случае вы получаете n классификаторов, а полученный класс имеет самый высокий балл Во втором классе полученный класс получается большинством голосов всех классификаторов.

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

Ответ 3

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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)