опорные векторные машины в Matlab - PullRequest
10 голосов
/ 12 февраля 2011

Не могли бы вы привести пример классификации 4 классов с использованием машин опорных векторов (SVM) в Matlab примерно так:

atribute_1  atribute_2 atribute_3 atribute_4 class
1           2          3           4             0
1           2          3           5             0
0           2          6           4             1
0           3          3           8             1
7           2          6           4             2
9           1          7           10            3

Ответы [ 2 ]

25 голосов
/ 12 февраля 2011

SVM были первоначально разработаны для бинарной классификации. Затем они были расширены для решения мультиклассовых задач. Идея состоит в том, чтобы разложить проблему на множество задач двоичного класса, а затем объединить их, чтобы получить прогноз.

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

Другой подход, называемый один против одного (который, я считаю, используется в LibSVM), создает k(k-1)/2 двоичные классификаторы, обучают разделять каждую пару классов друг против друга и использует голосование большинства. схема (max-win стратегии) ​​для определения выходного прогноза.

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

Пример (один против одного):

%# load dataset
load fisheriris
[g gn] = grp2idx(species);                      %# nominal class to numeric

%# split training/testing sets
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/3);

pairwise = nchoosek(1:length(gn),2);            %# 1-vs-1 pairwise models
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), ...
        'BoxConstraint',2e-1, 'Kernel_Function','polynomial', 'Polyorder',3);

    %# 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)

Вот пример вывода:

SVM (1-against-1):
accuracy = 93.75%
Confusion Matrix:
    16     0     0
     0    14     2
     0     1    15
14 голосов
/ 12 февраля 2011

MATLAB на данный момент не поддерживает мультиклассовый SVM. Вы могли бы использовать svmtrain (2-классы) для достижения этой цели, но было бы намного проще использовать стандартный пакет SVM.

Я использовал LIBSVM и могу подтвердить, что его очень легко использовать.


%%# Your data
D = [
1           2          3           4             0
1           2          3           5             0
0           2          6           4             1
0           3          3           8             1
7           2          6           4             2
9           1          7           10            3];
%%# For clarity
Attributes = D(:,1:4);
Classes = D(:,5);
train = [1 3 5 6];
test = [2 4];

%%# Train
model = svmtrain(Classes(train),Attributes(train,:),'-s 0 -t 2');

%%# Test
[predict_label, accuracy, prob_estimates] = svmpredict(Classes(test), Attributes(test,:), model);
...