проблемы после библиотеки addpath libsvm в matlab

Я хочу знать, как работает libsvm. Я попробовал этот код по этой ссылке [1]: 10-кратная перекрестная проверка в SVM "один против всех" (с использованием LibSVM) . Это работает (я не добавил библиотеку path libsvm в Matlab), но после добавления библиотеки libsvm. это не работает. Я понятия не имею, как это решить. есть ошибка:

Error using svmtrain (line 233)
Y must be a vector or a character array.

Error in libsvmtrain_ova (line 11)
        models{k} = svmtrain(double(y==labels(k)), X, strcat(opts,' -b 1 -q'));

Error in libsvmcrossval_ova (line 10)
        mdl = libsvmtrain_ova(y(trainIdx), X(trainIdx,:), opts);

Error in main (line 9)
acc = libsvmcrossval_ova(labels, data, opts, nfold);

кто-нибудь поможет мне, как это решить?? Спасибо


person user2157806    schedule 22.03.2013    source источник
comment
Конфликт имен с биоинформатикой svmtrain и libsvm svmtrain? Часто задаваемые вопросы по LIBSVM   -  person AGS    schedule 22.03.2013
comment
Я меняю этот CXX = g++ в Makefile на CXX = g++-X.Y. но все равно ошибка   -  person user2157806    schedule 22.03.2013
comment
Это не то, что я предлагаю. Попробуйте использовать полное имя пути при запуске libsmv svmtrain.   -  person AGS    schedule 22.03.2013


Ответы (2)


Я следил за сообщением, на которое вы ссылались, и получил результаты без ошибок. Для меня точность перекрестной проверки для набора данных «fisheriris» составляет 96,6667%. Для вас я думаю, что ошибка в том, что ошибка связана с «svmtrain», как сказано в первом комментарии. Далее я покажу, как я запускал код.

1) загрузите libsvm с http://www.csie.ntu.edu.tw/~cjlin/libsvm/ и распакуйте его.

2) изменить имена файлов svmtrain.c и svmpredict.c в \libsvm-3.16\matlab\ на libsvmtrain.c и libsvmpredict.c. Затем найдите make.m в той же папке и измените строку 16 и строку 17 на

mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmtrain.c ../svm.cpp svm_model_matlab.c
mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmpredict.c ../svm.cpp svm_model_matlab.c

3) запустите make.m, который вы только что изменили на файлы mex *.c.

4) после принятого ответа на сообщение 10-кратная перекрестная проверка в SVM "один против всех" (с использованием LibSVM) , вы создаете четыре файла .m для каждой функции, crossvalidation.m , libsvmcrossval_ova.m, libsvmpredict_ova.m, libsvmtrain_ova.m и запускаете основную функцию, предоставленную этим ответчиком , который выглядит следующим образом:

clear;clc;
%# laod dataset
S = load('fisheriris');
data = zscore(S.meas);
labels = grp2idx(S.species);

%# cross-validate using one-vs-all approach
opts = '-s 0 -t 2 -c 1 -g 0.25';    %# libsvm training options
nfold = 10;
acc = libsvmcrossval_ova(labels, data, opts, nfold);
fprintf('Cross Validation Accuracy = %.4f%%\n', 100*mean(acc));

%# compute final model over the entire dataset
mdl = libsvmtrain_ova(labels, data, opts);



acc = libsvmtrain(labels, data, sprintf('%s -v %d -q',opts,nfold));
model = libsvmtrain(labels, data, strcat(opts,' -q'));
person tqjustc    schedule 22.03.2013
comment
Большое спасибо за вашу помощь, это работает, но сначала мне нужно установить SDK. - person user2157806; 22.03.2013
comment
в любом случае ... знаете ли вы разницу между acc = libsvmcrossval_ova (labels, data, opts, nfold); fprintf('Точность перекрестной проверки = %.4f%%\n', 100*mean(acc)); и этот: acc = libsvmtrain(labels, data, sprintf('%s -v %d -q',opts,nfold)); почему результат разный?? - person user2157806; 22.03.2013
comment
@user2157806 user2157806 Для решения проблемы классификации нескольких классов существует множество подходов, например, «один против всех» и «один против одного». В libsvmcrossval_ova он использует один против всех. В libsvmcrossval_ova используется libsvmtrain, где libsvmtrain используется в качестве бинарной классификации. Но в acc = libsvmtrain(labels, data, sprintf('%s -v %d -q',opts,nfold)) libsvmtrain используется как многоклассовый классификатор. Они используют разные подходы к решению проблемы с несколькими классами, поэтому результаты разные. вы можете проверить этот пост: stackoverflow.com/questions/9041753 / - person tqjustc; 22.03.2013
comment
Итак, это одна и та же функция, то есть определение точности, но другой метод, верно? так что здесь (я пробую 2 класса), в моем результате libsvmtrain дает лучшие результаты, чем libsvmcrossval_ova. Итак, могу ли я использовать обе функции (libsvmtrain и libsvmcrossval_ova) для классификации двух классов? потому что мне просто нужно классифицировать рак и не рак. Спасибо - person user2157806; 22.03.2013
comment
есть только одна функция libsvmtrain. В вашем случае вы можете напрямую использовать libsvmtrain. поскольку это бинарная классификация, один против одного, один против всех одинаковы. Между тем, для любой проблемы классификации вы также можете использовать перекрестную проверку, которая может сделать модель более надежной. вам лучше пройти перекрестную проверку Google. Я не думаю, что ты это понимаешь. «перекрестная проверка» не имеет отношения к «один против одного» или «один против всех». Это два разных, почти независимых понятия. - person tqjustc; 23.03.2013
comment
в порядке . «один против одного» или «один против всех» используются для решения задач классификации нескольких классов, но возможно ли использовать модели «один против всех» для задачи двух классов? - person user2157806; 23.03.2013
comment
«один против всех» означает, что вы выбираете один класс как положительный класс, а другие — как отрицательный класс, чтобы вы могли преобразовать проблему с несколькими классами в двоичную классификацию. Поэтому, пожалуйста, проверьте, что такое «один против одного» и что такое «один против всех». прочитайте этот документ: hal.archives-ouvertes. fr/docs/00/10/39/55/PDF/ Также убедитесь, что вы знаете правила «один против одного», «один против всех», «перекрестная проверка» с помощью Google. - person tqjustc; 23.03.2013
comment
@ user2157806 libsvm может выполнять многоклассовую классификацию. Он использует один против одного методологии. См. раздел часто задаваемых вопросов libsvm здесь и выполните поиск на следующий вопрос: какой метод использует libsvm для мультиклассовой SVM? Почему бы вам не использовать метод 1-против-остального? - person Autonomous; 23.03.2013
comment
@Parag Я помню, что он использует один против одного для нескольких классов. да. мы используем один против остальных. (один против всех остальных). - person tqjustc; 25.03.2013

Есть очень простой способ. Установите папку libsvm в качестве приоритетного пути с помощью кнопки «Установить путь» в вашем Matlab.

person Melodie    schedule 06.05.2013
comment
это гораздо лучший ответ, чем перекомпиляция libsvm - person ; 13.10.2015