matlab - 实现 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 的最佳方法是什么。有人能帮我吗?
解决方案
你的代码对我来说看起来不错。当你说它永远不会结束时,我猜你只是没有等待足够长的时间。如果您的数据集相当大,拟合 ECOC SVM 模型可能需要很长时间。
使用fitcecoc
是拟合多类 SVM 模型的正确方法。SVM 本身只是一个二类模型,由fitcsvm
. 为了拟合多类模型,需要一个包装器。ECOC 就是这样一个包装器 - 它是做什么来获取每个类的,并分别为该类与所有其他类拟合一个二类模型。这就是为什么它需要这么长时间 - 它需要适合多个模型,每个类一个。
PS:你不需要X = [];
then X = [X; x y z];
。只是说X = [x y z]
,它具有相同的效果。同样,只要说Y = labels
.
推荐阅读
- linux - Make install 在终端命令中成功,但在 shell 脚本中失败
- java - 获取 java.lang.OutOfMemoryError:Jboss 上的 java 堆空间
- flutter - Flutter - 类'QuerySnapshot'没有实例方法'document'
- ios - 数组对象的过滤字典
- csv - 将空格分隔的文本文件加载到 MariaDB 数据库表中
- wpf - 我应该在哪个窗口中实例化我的对象?
- ios - 如何在iOS中根据时间更改获取访问位置权限值?
- flutter - Flutter:如何在没有 mp3 扩展的情况下流式传输由 http url 提供的实时音频
- javascript - 单击重叠区域时如何触发两个元素的单击
- go - 返回消息列表