我正在寻找一些帮助来确定两个类之间的线性决策边界。
我没有运气就看了搜索结果。 Implementing a linear, binary SVM (support vector machine)类似但不太明显。
我的问题归结为如何从权重向量中提取正确的线方程。
给定一个测试数据矩阵X=[Xa Xb]
,其中Xa=[Nx2]
&& Xb=[Nx2]
个数据样本。
它们存储在[Nx1]向量Y=[1 1 ... 1 -1 -1... -1]'
我使用MATLAB的quadprog.m来解决二次规划...
我知道我们要解决w1x1 + w2x2 + wo=0
,所以在我的代码中我解决了W=[w1 w2]
;我解决了wo=1/Y1 - WX1^T
。
实施时,我的决策边界绘制为:
显然这不是我想要的。线的斜率看起来是合法的,但我想我想把它翻译一下以进行优化。在这张图片中,黄点是支持向量。
似乎我使用了第一个数据点,X(1,:)是准确的,我的线路很糟糕。如果我使用不同的点,它会在不同的地方绘制线,这在代数上是有道理的,但我如何得到最佳边界,而不仅仅是与加权矢量正交的平行边界?
谢谢!
如果您对代码感兴趣,请点击:
function [alph,w,wo,sv]=svm_binary(Class1,Class2)
x1=Class1;
x2=Class2;
% Combine data into one set
xt=[x1;x2];
% Create class labels
y=[ones(length(x1),1); -1.*ones(length(x2),1)];
N=length(xt);
% Scatter plot of original data class data points
figure
scatter(x1(:,1),x1(:,2));
hold on
scatter(x2(:,1),x2(:,2));
legend('Class1','Class2')
xlabel('x1')
ylabel('x2')
title('Class Data Scatter Plot')
% Data component of Langrangian dual
H=(xt*xt').*(y*y');
% Vector to flip signs
f=-ones(N,1);
%Constraint 1) a(i)>=0
A= -eye(N);
a=zeros(N,1);
% Constraint 2) sum[a(i)y(i)]=0
B=[y';zeros(N-1,N)];
b=zeros(N,1);
%Solve Quadratic Programming optimization for alpha
alph=quadprog(H+eye(N)*.001,f,A,a,B,b);
%Solve for W
w=(alph.*y)'*xt;
sv=[];
for i=1:length(xt)
if abs(alph(i))>=.0000001
sv=[sv i];
end
end
xtsv=xt(sv,:);
wo=1/y(1)-w*xt(1,:)';
if abs(w(1))<=.000001
y=-wo/w(2).*ones(round(max(xt(:,1))-min(xt(:,1))),1);
x=min(xt(:,2)):(max(xt(:,2))-min(xt(:,2)))/(length(y)-1):max(xt(:,2));
elseif abs(w(2))<=.000001
x=-wo/w(1).*ones(round(max(xt(:,2))-min(xt(:,2))),1);
y=min(xt(:,1)):(max(xt(:,1))-min(xt(:,1)))/(length(x)-1):max(xt(:,1));
else
x=round(min(xt(:,1))):round(max(xt(:,1)))
y=(w(1)/w(2)).*-x-wo/(w(2));
end
sv=[];
for i=1:length(xt)
if abs(alph(i))>=.0000001
sv=[sv i];
end
end
xtsv=xt(sv,:);
scatter(xtsv(:,1),xtsv(:,2),'fillled','markeredgecolor','black','markerfacecolor','yellow');
% y=-(w(1).*x)-wo
length(x)
length(y)
hold on
plot(x,y)