【问题标题】:Is transposing training set affects the results with SVM转置训练集是否会影响 SVM 的结果
【发布时间】:2016-03-09 19:27:47
【问题描述】:

我正在研究人类年龄分类,我必须将数据分为两类,即YoungOld。作为一个分类器,我使用SVM,这就是我迄今为止所做的数据分析:

  1. TrainingSet 的大小为 (11264, 284) :其中每一列对应一个 observation(一个人)。这意味着我有 284 个人用于训练任务和 11264 个特征。
  2. TestSet 也被格式化为TrainingSet
  3. Groups(标签)是一个矩阵 Groups(284, 1),用 (1) 填充 Olds 和 (-1) 填充 Youngs
  4. 我使用 matlab 内置函数训练 SVM 以拥有 `SvmStruct'。

    SvmStruct = svmtrain(TrainingSet, Groups')
    
  5. 然后我介绍TestSet 使用这个matlab 函数以获得分类结果。

    SvmClassify = svmclassify(SvmStruct, TestSet)
    

在查看有关SVMmatlab 帮助后,我推断必须以TrainingSet 的每一行对应于Observation 的方式将数据引入SVM 分类器(a以我为例),每列对应一个特征。所以到目前为止我所做的是转置这些矩阵(TrainingSetTestSet)。 是不是我做错了,得到的结果都是错的?

【问题讨论】:

    标签: matlab matrix classification svm


    【解决方案1】:

    我查看了svmtrain 的源代码,如果组数与行数不匹配,它会转置训练数据(svmtrain.m,第 249 行 ff,MATLAB 2015b):

    % make sure data is the right size
    if size(training,1) ~= size(groupIndex,1)
        if size(training,2) == size(groupIndex,1)
            training = training';
        else
            error(message('stats:svmtrain:DataGroupSizeMismatch'))
        end
    end
    

    所以不,你的训练结果没有错。

    但是,svmclassify 不会转置测试数据,它只会检查正确数量的特征(svmclassify.m,第 63 行 ff.):

    if size(sample,2)~=size(svmStruct.SupportVectors,2)
        error(message('stats:svmclassify:TestSizeMismatch'));
    end
    

    所以这应该触发了一个错误(sample 是你的TestSet)。

    【讨论】:

    • @zeeMonkeez 非常感谢。你真的救了我 6 个月的工作!
    • @zeeMonkeez 所以我必须在执行 SvmClassify 函数之前转置 TestSet ?
    • @mohammedaouledissa 除非我在svmclassify.m 中遗漏了什么,是的。如果类的数量不匹配,它确实应该触发错误。但是,这可能与以前版本的 MATLAB 有所不同。您可以随时检查自己:edit svmclassify.m
    • 我已经检查了svmClassify,正如你所说,SvmClassify不会转置TestSet,如果类数不匹配会触发错误。
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2019-01-04
    • 2015-08-14
    • 1970-01-01
    • 2014-01-29
    • 2014-05-18
    • 2015-05-04
    • 2015-07-25
    相关资源
    最近更新 更多