使用MATLAB和libsvm绘制SVM边距

时间:2015-02-17 06:52:27

标签: matlab machine-learning svm libsvm

我正在使用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 个答案:

答案 0 :(得分:3)

这取决于你所说的“边缘”。它还取决于你所说的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是标签。