无法正确分类功能

时间:2012-01-10 20:05:29

标签: validation matlab computer-vision svm

我正在关注此页面上的示例:Example of 10-fold SVM classification in MATLAB

基本上,我按照这个例子来执行我的分类。我面临的问题是,pred总是积极的。它无法检测到负面数据。

clear all;
clc;
load('C:\Users\HP\Documents\MATLAB\TrainLabel');
load('C:\Users\HP\Documents\MATLAB\TrainVec');
cvFolds = crossvalind('Kfold', TrainLabel, 10);  
cp = classperf(TrainLabel);   
for i = 1:10                                   
    testIdx = (cvFolds == i);                   
    trainIdx = ~testIdx;                             
%     Model = svmtrain(TrainVec(trainIdx,:), TrainLabel(trainIdx),'showplot',true); 
    Model = svmtrain(TrainVec(trainIdx,:), TrainLabel(trainIdx), ...              
     'Autoscale',true, 'Showplot',false, 'Method','QP', ...              
     'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);
    pred = svmclassify(Model, TrainVec(testIdx,:),'Showplot',false);      
    cp = classperf(cp, pred, testIdx);
end 
cp.CorrectRate 
cp.CountingMatrix 

pred的值是[1; 1; 1; 1; 1; 1],但我的正确率是0.65(65%),而TrainLabel是<60x1 double&gt;和TrainVec是&lt; 60x5900 double&gt;。

另外两个qns:

  1. TrainLabel的值必须为0和1吗?如果它是-1或1

  2. 就可以了
  3. TrainVec使得图像中的每个要素都放在一行中。下一个图像的功能放在下一行。它是否正确?或者每项功能必须放在不同的栏目中吗?

  4. 需要一些帮助...谢谢

2 个答案:

答案 0 :(得分:4)

你需要很多功能。

您正在尝试仅使用60个训练点找到分离的5899维超平面。由于Curse of dimensionality(又名休斯效应),这根本不起作用。

您需要先提取相关功能,然后才能处理这些功能。这称为Feature Extraction

这样做的一种简单方法是使用pcacov使用Principle Component Analysis转换数据,然后只保留一定比例(使用第三个EXPLAINED结果来保持k PC的解释一种证据等级差异,如98%)。这将缩短你的问题的维度,并很可能改善你的结果。

请记住转换所有您的数据,而不仅仅是培训集。

除此之外,你的方法对我来说似乎是正确的。不同的样本分为不同的行,其特征跨越列。

标签向量可以是您想要的任何内容:

  

Y是分组变量,即它可以是a       分类,数字或逻辑向量;字符串的单元格向量;或者a       字符矩阵,每行代表一个类标签(请参阅帮助       groupingvariable)

答案 1 :(得分:-1)

将值缩放到0到1之间。这将解决问题