Matlab Stats测试中的Svm错误

时间:2014-04-28 01:39:03

标签: matlab svm

我正在使用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。这个问题应该是什么原因?

2 个答案:

答案 0 :(得分:4)

这应该是可以解决的,并牢记我的generic solution to this problem

1)使用dbstop if error

运行代码

它现在将停在你提供的那一行:

outclass= glevels(outclass(~unClassified),:);

2)检查可能的解决方案。

在这种情况下,我假设glevelsoutclass都是。{     变量。接下来要做的就是仔细检查     一切都可能是一个索引。

从内到外:

  • 第一个索引是~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值变为零,第二行将所有复数变为实数。