我正在使用svmlib对二维不可分数据进行线性分类。我能够使用svmlib训练SVM并获得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;endy_hat = sign(w'*X' + b);sv = full(model.SVs);% plot support vectorsplot(sv(:,1),sv(:,2),'ko', 'MarkerSize', 10);% plot decision boundaryplot_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)
回答:
这取决于你所说的“边界”是指什么。也取决于你讨论的是哪种SVM版本(可分还是不可分),但由于你提到了libsvm,我假设你指的是更一般的,不可分版本。
“边界”一词可以指从分离超平面到由wx+b=1
(或wx+b=-1
)定义的超平面的欧几里得距离。这个距离由1/norm(w)
给出。
“边界”也可以指特定样本x
的边界,即x
与分离超平面的欧几里得距离。它由
(wx+b)/norm(w)
给出,注意这是一个带符号的距离,即根据点x
位于超平面的哪一侧,它可能是负值或正值。你可以将其绘制为从点到超平面的垂直线。
另一个有趣的值是松弛变量xi
,它是支持向量从由wx+b=+1
(或-1
)定义的“硬”边界的“代数”距离(不是欧几里得距离)。它仅对支持向量为正值,如果一个点不是支持向量,其xi
等于0。更紧凑地表示为:
xi = max(0, 1 – y*(w’*x+b))
其中y
是标签。