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

Posted

技术标签:

【中文标题】绘制一对多 SVM 中 10 倍交叉验证的结果(使用 LibSVM)【英文标题】:Plot result of 10 fold cross-validation in one-against-all SVM (using LibSVM) 【发布时间】:2012-12-14 14:10:31 【问题描述】:

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

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

hold off
figure();
for j=1:numLabels
   w = modelsj.SVs' * models j.sv_coef;
   b = -modelsj.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)

【问题讨论】:

你能告诉我们你得到的错误吗? 绘制的支持向量非常低,我认为结果在正确的示意图中无法识别,您是否测试过这段代码? 我没有得到任何结果。我建议您编辑您的问题并提供有关您的问题的更多信息。 我想在一对多 SVM(使用 LibSVM)中绘制此链接的 10 折交叉验证结果以进行训练。 我自己找不到任何使用 libsvm 绘制一对多的解决方案。This 工具箱为一对多 SVM 提供了良好的绘图功能,但它与 LibSVM 无关。如果你不想使用 libsvm,我强烈推荐使用 stprtool。 【参考方案1】:

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

虹膜数据(见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),stylei);
    hold on;
    w = mdl.modelsi.SVs' * mdl.modelsi.sv_coef;
    b = -mdl.modelsi.rho;
    x = -2:0.1:2
    y = -(w(1)/w(2))*x - (b/w(2));
    plot(x,y,styleli);
end

grid on;
hold off;

这是情节:

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

【讨论】:

感谢您的回答,我们如何在这个绘图结果中显示支持向量?

以上是关于绘制一对多 SVM 中 10 倍交叉验证的结果(使用 LibSVM)的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用插入符号进行交叉验证的 SVM

从 R 中的交叉验证(训练)数据中绘制 ROC 曲线

MATLAB 支持向量机 (SVM) 交叉验证实现以提高代码速度

为啥 scikit-learn SVM 分类器交叉验证这么慢?

加快 SVM 评分中的交叉验证

5倍交叉验证如何理解