使用 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分类遇到的问题与解决
绘制一对多 SVM 中 10 倍交叉验证的结果(使用 LibSVM)