【问题标题】:Not able to classify the features correctly无法正确分类特征
【发布时间】:2012-02-07 05:59:17
【问题描述】:

我正在关注此页面上的示例: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 是 ,TrainVec 是 。

另外两个qns:

  1. TrainLabel 的值必须是 0 和 1 吗?是-1还是1可以吗

  2. TrainVec 使得图像中的每个特征都放置在一行中。下一张图像中的特征放置在下一行。它是否正确?还是必须将每个功能放在不同的列中?

在这方面需要一些帮助...谢谢

【问题讨论】:

    标签: validation matlab computer-vision svm


    【解决方案1】:

    你只需要很多功能。

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

    您需要先提取相关特征,然后只处理这些特征。这称为Feature Extraction

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

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

    除此之外,您的方法对我来说似乎是正确的。不同的样本位于不同的行中,它们的特征跨越列。

    标签向量可以是任何你想要的:

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

    【讨论】:

    • 首先,感谢您的回复.. 非常感谢.. 有一件事我想问,除了 PCA 部分,我的代码是否正确编写?
    • 我想说问题不在于他的功能太多,而在于他的样本太少......
    • 我猜他的意思是训练样本。 @Oli:嗯,我不同意这一点。我认为没有任何实际示例具有 5900 个实际识别特征。如果您需要全部使用它们,那么您确实需要更多的训练实例。但如果事实证明你可以提取 10 个有辨识度的特征,那么 60 个训练样本就可以了。
    • TrainLabel 的值必须是 0 和 1 吗?是-1还是1可以吗
    • 两者都可以,只要你一直在使用。请参阅我回答的最后一句话。
    【解决方案2】:

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

    【讨论】:

    • 这是完全错误的。 5900 项功能绝对不会让您逍遥法外。除此之外,看看doc svmtrain:它说:“autoscale:布尔值,指定 svmtrain 是否自动将数据点集中在它们的平均值上,并在训练之前将它们缩放为具有单位标准偏差。默认值:真”。所以无论你是否扩展都无关紧要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2015-04-17
    • 2011-04-07
    • 2013-01-26
    • 2014-02-25
    • 2017-08-01
    • 2018-03-11
    相关资源
    最近更新 更多