绘制一对多 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)的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB 支持向量机 (SVM) 交叉验证实现以提高代码速度