我正在使用stats包中包含的Matlab 2012 svm。我有一个二进制分类问题,我训练一组向量并测试另一组向量,如下面的matlab代码所示:
%set the maximum number of iterations
optSVM = statset('MaxIter', 1000000);
%train the classifier with a set of feature vectors
SVMtrainModel = svmtrain(training_vectors_matrix(:,2:end), training_vectors_matrix(:,1), 'kernel_function' , 'linear', 'options', optSVM, 'tolkkt', 0.01);
%read the test vectors
TestV = csvread(test_file);
%Test the feature vectors in the built classifier
TestAttribBin = svmclassify(SVMtrainModel, TestV(:,2:end))
这是一个非常简单的代码,可以正常运行。训练运行正常,但是当我测试时发生以下错误:
Subscript indices must either be real positive integers or logicals.
Error in svmclassify (line 140)
outclass= glevels(outclass(~unClassified),:);
那么,我的特征向量是否有任何问题?如果我在不同的特征向量(训练和测试向量)中运行相同的代码,代码运行正常。我已经检查了特征向量,并且没有NaN。这个问题应该是什么原因?
答案 0 :(得分:4)
这应该是可以解决的,并牢记我的generic solution to this problem。
1)使用dbstop if error
它现在将停在你提供的那一行:
outclass= glevels(outclass(~unClassified),:);
2)检查可能的解决方案。
在这种情况下,我假设glevels
和outclass
都是。{
变量。接下来要做的就是仔细检查
一切都可能是一个索引。
从内到外:
~unClassified
,因为~
操作没有失败,可以肯定地说这是一个逻辑向量。outclass(~unClassified)
,这个很可能不仅仅包含1,2,3,...或者true,false值等数字。 测试值是否全部有效非常简单,其中一个应该成立:
x
中的值是合乎逻辑的:class(x)
应返回'logical'x
中的值是实数正整数:isequal(x, max(1,round(abs(x))))
应返回“true”。答案 1 :(得分:1)
如果您删除 NaN 行或数据,则可以解决此问题:
Features(~any(~isnan(Features), 2),:)=[];
也许你也有复杂的数字,然后使用这段代码:
Features3(any(isnan(Features3),2),:)=0;
Features3 =real(Features3);
第一行,使所有NaN值变为零,第二行将所有复数变为实数。