是否转置训练集影响SVM的结果

Is transposing training set affects the results with SVM

我正在研究人类年龄问题,我必须将数据分为两个 类,即 YoungOld。作为分类器,我正在使用 SVM,这是我到目前为止为准备数据所做的工作:

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

    SvmStruct = svmtrain(TrainingSet, Groups')
    
  5. 然后我引入TestSet使用这个matlab函数来得到分类结果

    SvmClassify = svmclassify(SvmStruct, TestSet)
    

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

我查看了 svmtrain 的源代码,如果组数与行数不匹配,它会转置训练数据(svmtrain.m,第 249 行,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 行以下):

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

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