如何使用Matlab的quadprog实现软边界SVM模型?

时间:2013-03-20 15:20:49

标签: matlab machine-learning svm quadprog

假设我们获得{yᵢ, xᵢ}的培训数据集i = 1, ..., n,其中yᵢ可以是-11xᵢ可以例如2D或3D点。

通常,当输入点可线性分离时,SVM模型可以定义如下

min 1/2*||w||²
w,b

受限制(对于i = 1, ..., n

yᵢ*(w*xᵢ - b) >= 1

这通常称为hard-margin SVM model,因此是constrained minimization problem,其中未知数为wb。我们也可以省略函数中的1/2,因为它只是一个常数。

现在,documentation关于Matlab的quadprog个州

  

x = quadprog(H, f, A, b)根据限制1/2*x'*H*x + f'*x最小化A*x ≤ bA是双打矩阵,b是双精度数。

我们可以使用quadprog函数实现硬边距SVM模型,以获得权重向量w,如下所示

  • H成为单位矩阵。
  • f'成为零矩阵。
  • A是约束的左侧
  • b等于-1,因为原始约束为>= 1,当我们在两边乘以<= -1时,它变为-1

现在,我正在尝试实施soft-margin SVM model。这里的最小化方程是

min (1/2)*||w||² + C*(∑ ζᵢ)
w,b

受限制(对于i = 1, ..., n

yᵢ*(w*xᵢ - b) >= 1 - ζᵢ

ζᵢ >= 0,其中是求和符号,ζᵢ = max(0, 1 - yᵢ*(w*xᵢ - b))Chyper-parameter

如何使用Matlab的quadprog函数解决此优化问题?我不清楚如何将等式映射到quadprog函数的参数。

软边距SVM模型的“原始”形式(即上面的定义)可以转换为“dual”形式。我做到了,我能够得到拉格朗日变量值(双重形式)。但是,我想知道我是否可以使用quadprog直接解决原始形式而无需将其转换为双重形式。

3 个答案:

答案 0 :(得分:9)

我不明白这是怎么回事。让z成为(2n + 1)变量的载体:

z = (w, eps, b)

然后,H变为对角矩阵,对角线上的前n值等于1,最后n + 1设为零:

H = diag([ones(1, n), zeros(1, n + 1)])

向量f可表示为:

f = [zeros(1, n), C * ones(1, n), 0]'

第一组约束变为:

Aineq = [A1, eye(n), zeros(n, 1)]
bineq = ones(n, 1)

其中A1是与原始形式相同的矩阵。

第二组约束成为下界:

lb = (inf(n, 1), zeros(n, 1), inf(n, 1))

然后你可以调用MATLAB:

z = quadprog(H, f, Aineq, bineq, [], [], lb);

P.S。我可能会在一些小细节中弄错,但总的想法是正确的。

答案 1 :(得分:-1)

如果让z =(w; w0; eps)T是具有n + 1 + m个元素的长向量。(m个点数) 然后,

H= diag([ones(1,n),zeros(1,m+1)]).
f = [zeros(1; n + 1); ones(1;m)]

不等式约束可以指定为:

A = -diag(y)[X; ones(m; 1); zeroes(m;m)] -[zeros(m,n+1),eye(m)],

其中X是原始形式的n x m输入矩阵。在A的2个部分中,第一部分用于w0,第二部分用于eps。

b = ones(m,1) 

等式约束:

Aeq = zeros(1,n+1 +m)
beq = 0

边界:

lb = [-inf*ones(n+1,1); zeros(m,1)]
ub = [inf*ones(n+1+m,1)]

现在,z=quadprog(H,f,A,b,Aeq,beq,lb,ub)

答案 2 :(得分:-1)

完整的代码。这个想法和上面一样。

n = size(X,1);
m = size(X,2);
H = diag([ones(1, m), zeros(1, n + 1)]);
f = [zeros(1,m+1) c*ones(1,n)]';
p = diag(Y) * X;
A = -[p Y eye(n)];
B = -ones(n,1);
lb = [-inf * ones(m+1,1) ;zeros(n,1)];
z = quadprog(H,f,A,B,[],[],lb);
w = z(1:m,:);
b = z(m+1:m+1,:);
eps = z(m+2:m+n+1,:);