我必须实现一个识别标签的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.
总的来说,我不太了解在Matlab中运行SVM的最佳方法是什么。有人可以帮我吗?
答案 0 :(得分:0)
您的代码对我来说看起来不错。当您说它永远不会结束时,我想您只是还没有等很久。如果您的数据集很大,则拟合ECOC SVM模型可能需要很长时间。
使用fitcecoc
是适合多类SVM模型的正确方法。 SVM本身只是一个两类模型,由fitcsvm
拟合。为了适合多类模型,需要包装器。 ECOC是这样的包装器-采取每个班级的工作,并针对该班级分别针对所有其他班级设置两班级模型。这就是为什么要花这么长时间的原因-它需要适合多个模型,每个模型一个。
PS:您不需要先X = [];
,然后再X = [X; x y z];
。只需说X = [x y z]
,它就具有相同的效果。同样,只需说Y = labels
。