0

我想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)
4

1 回答 1

0

您的代码无法正常工作,您似乎遗漏了许多概念性问题。我假设你明白:

  • 虹膜数据(参见链接问题)是 4 维的。该空间中的线性分类器是 4 维的超平面,您不能在 2 维平面中绘制 4 维函数。
  • 为 3 个类绘制一对多分类器的结果是三个超平面
  • 绘制 10 折交叉验证的结果本身是没有意义的,因为没有一个可绘制的结果,您可以绘制每个中间结果,但距离实现这一目标还很遥远。

我仍然认为这里有一个真正的问题。我将获取虹膜数据的二维并绘制分离的超平面(在本例中为线)。当您拥有链接代码时,您需要做的就是以下几点:

  • 选择两个维度,在我的例子中,我选择了虹膜数据的维度 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;

这是情节:

在此处输入图像描述

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

于 2012-12-31T09:40:49.927 回答