如何使用 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ᵢ 可以是-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函数实现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中的优化工具包都能求解哪些类型的优化问题?求解的函数是啥?

如何使用 libsvm 库(Matlab)实现 1 对 1 多类分类?

如何使用 Matlab 实现 KNN 并计算百分比准确度

Matlab是如何实现高效的子索引的?