【问题标题】:Matlab Stats Svm error in testingMatlab Stats Svm 测试中的错误
【发布时间】:2015-12-28 01:21:54
【问题描述】:

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

【问题讨论】:

  • 看来问题一定出在您的数据上,因为您说使用不同的数据代码可以工作。如果没有看到您的数据样本,很难回答这个问题。但是,想到的一种可能性是训练数据中的标签可能不是整数值?你检查过吗?也许值得将你的训练标签的 class() 与那些不起作用的进行比较?

标签: matlab svm


【解决方案1】:

记住我的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) 应该返回“逻辑”
  • 要确认x 中的值是真正的正整数:isequal(x, max(1,round(abs(x)))) 应该返回“true”。

【讨论】:

  • 非常感谢您的回答。如果错误和类(未分类)返回逻辑,我尝试了 dbstop。我使用的是 matlab 2013a,所以这里不存在 isequal。有没有其他方法可以检查?
  • outclass(~unClassified) 返回以下行向量: ans = -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 - 0.0001i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 - 0.0001i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i -1.0000 + 0.0000i
  • unClassified 返回以下行向量:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • @mad outclass(~unClassified) 的第一个元素是-1。当然,您无法访问glevels 的第-1 行,因此错误消息是准确的。 --- 假设您使用标准svmclassifysvmtrain,可以安全地假设错误不在程序中,而是因为您输入了无效数据。但是,如果您无法找到数据的问题,并且想了解更多信息,那么追溯错误并查看第一个不规则事件发生的位置应该会有所帮助。
  • @mad 无意冒犯,但由于 MATLAB 是一个相当稳定的产品,并且矩阵连接是这种语言的基本操作......您的数据中似乎更有可能存在污垢,或者您使用的代码中的错误,而不是 MATLAB 本身中的错误。当然,这取决于你,但我仍然有兴趣挖掘到想象矩阵出现的地步。
【解决方案2】:

如果您删除 NaN rowsdata,则可以解决此问题:

    Features(~any(~isnan(Features), 2),:)=[];

也许您也有复数,然后使用以下代码:

    Features3(any(isnan(Features3),2),:)=0;
    Features3 =real(Features3);

第一行,使所有的 NaN 值变为零,第二行将所有的复数变为实数。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2015-03-07
    • 2013-10-29
    • 2018-06-10
    • 2016-03-22
    • 2016-07-26
    • 2017-04-21
    • 2013-06-07
    • 2016-07-28
    相关资源
    最近更新 更多