使用 MATLAB 和 libsvm 绘制 SVM 边距
Plot SVM margins using MATLAB and libsvm
我正在使用 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;
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)
这取决于你所说的 "the margins" 是什么意思。它还取决于您所谈论的 SVM 版本(不可分离的可分离版本),但由于您提到了 libsvm,我假设您指的是更通用的不可分离版本。
术语"margin"可以指从分离超平面到由wx+b=1
(或wx+b=-1
)定义的超平面的欧氏距离。此距离由 1/norm(w)
给出。
"Margin"也可以指代特定样本x
的margin,即x
与分离超平面的欧式距离。它由
给出
(wx+b)/norm(w)
注意这是一个带符号的距离,即negative/positive,取决于点x
位于超平面的哪一侧。您可以将其绘制为垂直于超平面的点的线。
另一个有趣的值是松弛变量 xi
,它是支持向量与 wx+b=+1
定义的 "hard" 边距的 "algebraic" 距离(非欧几里得) (或 -1
)。它只对支持向量为正,如果一个点不是支持向量,它的xi
等于0。更紧凑:
xi = max(0, 1 - y*(w'*x+b))
其中 y
是标签。
我正在使用 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;
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)
这取决于你所说的 "the margins" 是什么意思。它还取决于您所谈论的 SVM 版本(不可分离的可分离版本),但由于您提到了 libsvm,我假设您指的是更通用的不可分离版本。
术语"margin"可以指从分离超平面到由wx+b=1
(或wx+b=-1
)定义的超平面的欧氏距离。此距离由 1/norm(w)
给出。
"Margin"也可以指代特定样本x
的margin,即x
与分离超平面的欧式距离。它由
(wx+b)/norm(w)
注意这是一个带符号的距离,即negative/positive,取决于点x
位于超平面的哪一侧。您可以将其绘制为垂直于超平面的点的线。
另一个有趣的值是松弛变量 xi
,它是支持向量与 wx+b=+1
定义的 "hard" 边距的 "algebraic" 距离(非欧几里得) (或 -1
)。它只对支持向量为正,如果一个点不是支持向量,它的xi
等于0。更紧凑:
xi = max(0, 1 - y*(w'*x+b))
其中 y
是标签。