使用 MATLAB 和 libsvm 绘制 SVM 边距

Posted

技术标签:

【中文标题】使用 MATLAB 和 libsvm 绘制 SVM 边距【英文标题】:Plot SVM margins using MATLAB and libsvm 【发布时间】:2015-04-17 20:09:24 【问题描述】:

我正在使用 svmlib 对二维不可分离数据进行线性分类。我能够训练 svm 并使用 svmlib 获得 w 和 b。使用这些信息,我可以绘制决策边界以及支持向量,但我不确定如何使用 svmlib 给我的信息绘制边距。

下面是我的代码:

model = svmtrain(Y,X, '-s 0 -t 0 -c 100');

w = model.SVs' * model.sv_coef;
b = -model.rho;
if (model.Label(1) == -1)
    w = -w; b = -b;
end
y_hat = sign(w'*X' + b);

sv = full(model.SVs);

% plot support vectors
plot(sv(:,1),sv(:,2),'ko', 'MarkerSize', 10);

% plot 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', 1)

【问题讨论】:

边距是决策边界和支持向量之间的距离。你想怎么画? 【参考方案1】:

这取决于您所说的“边距”是什么意思。它还取决于您所谈论的 SVM 版本(可分离与不可分离),但由于您提到 libsvm,我假设您的意思是更通用、不可分离的版本。

术语“边距”可以指从分离超平面到wx+b=1(或wx+b=-1)定义的超平面的欧几里得距离。这个距离由1/norm(w) 给出。

“边距”也可以指特定样本x的边距,即x与分离超平面的欧几里得距离。它由

给出

(wx+b)/标准(w)

请注意,这是一个有符号距离,即负/正,取决于点 x 所在的超平面的哪一侧。您可以将其绘制为从该点垂直于超平面的直线。

另一个有趣的值是松弛变量xi,它是支持向量与wx+b=+1(或-1)定义的“硬”边距的“代数”距离(不是欧几里得)。仅对支持向量为正,如果一个点不是支持向量,则其xi 等于0。更简洁:

xi = max(0, 1 - y*(w'*x+b))

y 是标签。

【讨论】:

我想我只是没有正确理解 svm 理论。给定你的方程,我怎么知道使用哪个支持向量来获得边距?离决策边界最远的是正确分类的支持向量吗? 我将编辑我的答案,因为它不够短,无法发表评论

以上是关于使用 MATLAB 和 libsvm 绘制 SVM 边距的主要内容,如果未能解决你的问题,请参考以下文章

matlab 基于 libsvm工具箱的svm分类遇到的问题与解决

如何在 Matlab 中使用 libsvm?

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

MATLAB安装libsvm工具箱的方法

如何在 Matlab 中为 libSVM 的 nu-SVM 使用变量而不是 nu 参数的数量?

如何在 libsvm 中绘制 4 维虹膜数据的决策边界?