如何使用 Matlab 的 quadprog 实现软边距 SVM 模型?
Posted
技术标签:
【中文标题】如何使用 Matlab 的 quadprog 实现软边距 SVM 模型?【英文标题】:How to implement a soft-margin SVM model using Matlab's quadprog? 【发布时间】:2013-03-09 18:54:40 【问题描述】:假设我们有一个训练数据集yᵢ, xᵢ
,对于i = 1, ..., n
,其中yᵢ
可以是-1
或1
,xᵢ
可以是例如2D 或 3D 点。
一般来说,当输入点线性可分时,SVM模型可以定义如下
min 1/2*||w||²
w,b
受约束(对于i = 1, ..., n
)
yᵢ*(w*xᵢ - b) >= 1
这通常称为hard-margin SVM model,因此是constrained minimization problem,其中未知数是w
和b
。我们也可以在要最小化的函数中省略1/2
,因为它只是一个常数。
现在,documentation 关于 Matlab 的 quadprog
状态
x = quadprog(H, f, A, b)
最小化1/2*x'*H*x + f'*x
受限于A*x ≤ b
。A
是双精度矩阵,b
是双精度向量。
我们可以使用quadprog
函数实现hard-margin 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))
和C
是hyper-parameter。
如何使用 Matlab 的 quadprog
函数解决这个优化问题?我不清楚方程应该如何映射到quadprog
函数的参数。
soft-margin SVM 模型的“primal”形式(即上面的定义)可以转换为“dual”形式。我这样做了,我能够得到拉格朗日变量值(以对偶形式)。但是,我想知道我是否可以使用quadprog
直接解决原始形式而无需将其转换为对偶形式。
【问题讨论】:
【参考方案1】:我不明白这怎么会是个问题。让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);
附:我可能会在一些小细节上犯错,但总体思路是正确的。
【讨论】:
“n”变量被抛出的方式让我更加困惑,但我明白了。 n 变量在很多地方都不能很好地匹配。非常感谢。 @user1067334 n代表特征数还是训练样本数?【参考方案2】:如果让 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 的两部分中,第一部分用于 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)
【讨论】:
【参考方案3】:完整的代码。思路和上面一样。
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,:);
【讨论】:
此代码不可运行。你能提供一个可运行的例子吗?例如,您应该提供X
等。以上是关于如何使用 Matlab 的 quadprog 实现软边距 SVM 模型?的主要内容,如果未能解决你的问题,请参考以下文章
matlab中用quadprog时为啥求出的极值和自己后来带入极值点的极值不同
使用 R 中的 quadprog 包对投资组合优化中的权重进行约束
Matlab中的优化工具包都能求解哪些类型的优化问题?求解的函数是啥?