метод опорных векторов в МатЛАБ
Не могли бы вы привести пример классификации 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 ответов
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);
SVMs были первоначально разработаны для двоичной классификации. Затем они были расширены для решения многоклассовых проблем. Идея состоит в том, чтобы разложить проблему на множество задач двоичного класса, а затем объединить их для получения прогноза.
один подход, называемый один-против-всех, строит столько двоичных классификаторов, сколько есть классов, каждый из которых обучен отделять один класс от остальных. Чтобы предсказать новый экземпляр, мы выбираем классификатор с наибольшим решением значение функции.
другой подход, называемый один на один (который я считаю используется в LibSVM), строит k(k-1)/2
бинарные классификаторы, обученные отделять каждую пару классов друг от друга и использовать мажоритарную схему голосования (max-win strategy) для определения выходного прогноза.
есть и другие подходы, такие как использование исправление ошибок выходной код (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