2015-12-09 2 views
0

Вот мой код для one-vs-one. Этот код не написан @amro. Я не понимаю, почему это происходит. Все выглядит очень просто, когда я изучал код. Пожалуйста, помогите мне исправить это. Я использую matlab2014a.one vs one svm multiclass class matlab code

Код: Один против Один

%# 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),'-s 0 -t 0'); 

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

Ошибка:

Reference to non-existent field 'SupportVectors'. 

Error in svmclassify (line 60) 
if size(sample,2)~=size(svmStruct.SupportVectors,2) 

Error in test_onevsone (line 21) 
    predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:)); 

Я также стараюсь, svmModel{1}.SupportVectors. И похоже, что SupportVectors не возвращается по структуре.

Некоторые один пожалуйста исправить эту ошибку ... Спасибо ...

ответ

0

Ваша ошибка в строке 18, svmModel{k} = svmtrain(meas(idx,:), g(idx),'-s 0 -t 0');. Функция svmtrain принимает вход 2 + 2n. Правильный синтаксис: svmtrain(Training, Group) или svmtrain(Training, Group, Name, Value). Имя и значение - парный аргумент. Имя - это имя аргумента, а Value - соответствующее значение. Вы используете '-s 0 -t' как третий, и это не аргумент Matlab Name! Исправьте его и используйте свой код.