Функция для реализации SVM Matlab - PullRequest
0 голосов
/ 04 декабря 2018

Я должен реализовать классификатор SVM, который распознает метки.Код таков:

function[Y_SVM_test] = getSVM(x,y,z, labels)

%matrix that contain x,y,z
X = [];

%vector of labels
Y = [];

X = [X; x y z];
Y = [Y; labels];

cv = cvpartition(length(X),'holdout',0.2);

% Training set 
Xtrain = X(training(cv),:);
Ytrain = Y(training(cv));


% Test set
Xtest = X(test(cv),:);
Ytest = Y(test(cv));

tic
mySVM = fitcecoc(Xtrain,Ytrain);
toc

Y_SVM_test = predict(mySVM,Xtest);

end

С функцией fitcecoc выполнение никогда не заканчивается, я использовал его неправильно?Я попытался использовать также функцию fitcsvm, которая кажется более конкретной из документации, но я получаю следующую ошибку: Error using ClassificationSVM.prepareData (line 686) You can not train an SVM model for more than 2 classes. В общем, я не совсем понял, как лучше всего запустить SVM в Matlab.Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 04 декабря 2018

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

Использование fitcecoc - это правильный путь для подгонки мультиклассовой модели SVM.SVM сами по себе являются моделью только двух классов, которая установлена ​​на fitcsvm.Чтобы соответствовать мультиклассовой модели, требуется обертка.ECOC - такая обертка - что она делает для каждого класса и отдельно подбирает двухклассную модель для этого класса против всех остальных.Вот почему это может занять так много времени - оно должно соответствовать нескольким моделям, по одной для каждого класса.

PS: вам не нужно X = [];, а затем X = [X; x y z];.Просто скажите X = [x y z], это имеет тот же эффект.Точно так же просто скажите Y = labels.

...