当使用svm分类时,如何在matlab中获得错误与时期(迭代)的关系图?

时间:2014-09-19 03:19:31

标签: matlab svm

我使用svmtrain来训练我的数据集,并svmclassify来预测测试集。我想看一下优化过程,错误与时期(迭代)的关系。我查看了用法和代码,发现没有关于此类问题的信息。我唯一能得到的就是控制最大迭代次数。

如何在使用SVM分类时在matlab中获取错误与时期(迭代)的关系图?

这是我修改过的代码。但不是我想要的那个,我想在每个时代都有错误。以前有人做过这样的分析吗?谢谢。 最好的问候!

%# load dataset
load fisheriris                                %# load iris dataset
Groups = ismember(species,'setosa');           %# create a two-class problem

MaxIterValue = 210;                            %# maximum iterations
ErrVsIter = zeros(MaxIterValue, 2);            %# store error data

%# Control maximum iterations
for N = 200: MaxIterValue
%   options.MaxIter = N;
    option = statset('MaxIter', N);
    %# 5-fold Cross-validation
    k = 5;
    cvFolds = crossvalind('Kfold', Groups, k);      %# get indices of 5-fold CV
    cp = classperf(Groups);                         %# init performance tracker

    for i = 1:k                                     %# for each fold
      testIdx = (cvFolds == i);                     %# get indices of test instances
      trainIdx = ~testIdx;                          %# get indices training instances

      %# train an SVM model over training instances
      svmModel = svmtrain(meas(trainIdx,:), Groups(trainIdx), ...
                 'options',option, 'Autoscale',true, 'Showplot',false, 'Method','QP', ...
                   'BoxConstraint',2e-1, 'kernel_function','linear');

      %#plotperform(svmModel);

      %# test using test instances
      pred = svmclassify(svmModel, meas(testIdx,:), 'Showplot',false);

      %# evaluate and update performance object
      cp = classperf(cp, pred, testIdx);
      
    end
    %# get error rate
    ErrVsIter(N, 1) = N;
    ErrVsIter(N, 2) = cp.ErrorRate;

end

plot(ErrVsIter(1:MaxIterValue,1),ErrVsIter(1:MaxIterValue,2));

1 个答案:

答案 0 :(得分:0)

你做的都是正确的,问题是 SVM 每次都找到解决方案!因此,每个纪元都有 CorrectRate = 1 ,请尝试在代码中输入 cp.CorrectRate 进行查看。

问题出在下面一行:

 Groups = ismember(species,'setosa');          

数据非常简单, SVM 可以解决。

并将其绘制成如下:

plot(ErrVsIter(200:MaxIterValue,1),ErrVsIter(200:MaxIterValue,2));