首页 > 解决方案 > 实现 SVM Matlab 的函数

问题描述

我必须实现一个识别标签的 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执行永无止境,我用错了吗?我也尝试使用 function fitcsvm,这在文档中似乎更具体,但我得到的错误如下:Error using ClassificationSVM.prepareData (line 686) You can not train an SVM model for more than 2 classes. 一般来说,我不太了解在 Matlab 中运行 SVM 的最佳方法是什么。有人能帮我吗?

标签: matlabsvm

解决方案


你的代码对我来说看起来不错。当你说它永远不会结束时,我猜你只是没有等待足够长的时间。如果您的数据集相当大,拟合 ECOC SVM 模型可能需要很长时间。

使用fitcecoc是拟合多类 SVM 模型的正确方法。SVM 本身只是一个二类模型,由fitcsvm. 为了拟合多类模型,需要一个包装器。ECOC 就是这样一个包装器 - 它是做什么来获取每个类的,并分别为该类与所有其他类拟合一个二类模型。这就是为什么它需要这么长时间 - 它需要适合多个模型,每个类一个。

PS:你不需要X = [];then X = [X; x y z];。只是说X = [x y z],它具有相同的效果。同样,只要说Y = labels.


推荐阅读