在一对一SVM(使用LibSVM)中绘制10倍交叉验证的结果

时间:2012-12-29 17:43:13

标签: matlab svm libsvm cross-validation

我想在此链接中绘制libsvmtrain_ova的结果: 10 fold cross-validation in one-against-all SVM (using LibSVM)

,我在libsvmtrain_ova中使用了此代码,但我认为它无法正常运行。

hold off
figure();
for j=1:numLabels
   w = models{j}.SVs' * models {j}.sv_coef;
   b = -models{j}.rho;
   c1 = find(double(labels==1) == 1);
   c2= find(double(labels==2) == 1);
   c3=find(double(labels==3) == 1);
   plot(X(c1,1), X(c1,2), 'ko', 'MarkerFaceColor', 'b'); hold on;
   plot(X(c2,1), X(c2,2), 'ko', 'MarkerFaceColor', 'g');hold on;
   plot(X(c3,1), X(c3,2), 'ko', 'MarkerFaceColor', 'r')
   % Plot the decision boundary
   plot_x = linspace(min(X(:,1)), max(X(:,1)), 30);
   plot_y = (-1/w(2))*(w(1)*plot_x + b);
   plot(plot_x, plot_y, 'k-', 'LineWidth', 2)
end
title(sprintf('SVM Linear Classifier with C = %g', 1), 'FontSize', 12)

1 个答案:

答案 0 :(得分:0)

您的代码并不接近工作,似乎您似乎缺少许多概念性问题。我会假设你理解:

  • 虹膜数据(见linked question)是4维的。此空间中的线性分类器是4维的超平面,您无法在2维平面中绘制4维函数。
  • 为3个类绘制一对一分类器的结果是三个超平面
  • 绘制10倍交叉验证本身的结果是没有意义的,因为没有一个可绘制的结果,你可以绘制每个中间结果,但你很难完成。

我仍然认为这里有一个真正的问题。我将采用虹膜数据的两个维度并绘制分离的超平面(在这种情况下为线条)。当您拥有linked code时,您需要做的就是:

  • 选择两个尺寸,在我的情况下,我选择了虹膜数据的尺寸3和4。
  • 将数据分成两部分,一部分用于训练,一部分用于测试。
  • 做一点数学运算并绘制点和线。

这是代码:

S = load('fisheriris');
data = zscore(S.meas);
data = data(:,3:4);
labels = grp2idx(S.species);

opts = '-s 0 -t 2 -c 1 -g 0.25';    %# libsvm training options

indices = crossvalidation(labels, 2); 
testIdx = (indices == 1); trainIdx = ~testIdx;
mdl = libsvmtrain_ova(labels(trainIdx), data(trainIdx,:), opts);
figure(1);
numlabels = numel(unique(labels));
testlabels = labels(testIdx);
testdata = data(testIdx,:);
style = {'b+','r+','g+'};
stylel = {'b-','r-','g-'};
for i=1:numlabels,
    plot(testdata(find(testlabels==i),1),testdata(find(testlabels==i),2),style{i});
    hold on;
    w = mdl.models{i}.SVs' * mdl.models{i}.sv_coef;
    b = -mdl.models{i}.rho;
    x = -2:0.1:2
    y = -(w(1)/w(2))*x - (b/w(2));
    plot(x,y,stylel{i});
end

grid on;
hold off;

这是情节:

enter image description here

每条彩色线应该将所述颜色的点与所有其他颜色分开。观察这些线是通过训练获得的,而这些点来自我们没有训练的测试数据。