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

use*_*334 7 matlab machine-learning svm quadprog

假设我们都给出了训练数据集{y?, x?},对i = 1, ..., n,其中y?既可以是-11并且x?例如可以是二维或三维点.

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

min 1/2*||w||²
w,b
Run Code Online (Sandbox Code Playgroud)

受限制(for i = 1, ..., n)

y?*(w*x? - b) >= 1
Run Code Online (Sandbox Code Playgroud)

这通常被称为硬边界 SVM模型,因此是一个约束最小化问题,其中未知数是wb.我们也可以1/2在函数中省略最小化,因为它只是一个常数.

现在,关于Matlab 状态的文档quadprog

x = quadprog(H, f, A, b)最小化1/2*x'*H*x + f'*x受限制A*x ? b.A是双打矩阵,是双打b的向量.

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

  • H 成为一个单位矩阵.
  • f' 变成零点矩阵.
  • A 是约束的左侧
  • b等于-1因为原来的约束了>= 1,就<= -1当我们乘-1上两侧.

现在,我正在尝试实现软边际 SVM模型.这里的最小化方程是

min (1/2)*||w||² + C*(? ??)
w,b
Run Code Online (Sandbox Code Playgroud)

受限制(for i = 1, ..., n)

y?*(w*x? - b) >= 1 - ??
Run Code Online (Sandbox Code Playgroud)

这样,求和符号?? >= 0在哪里?,?? = max(0, 1 - y?*(w*x? - b))并且C超参数.

如何使用Matlab的quadprog函数解决这个优化问题?我不清楚方程应该如何映射到quadprog函数的参数.

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

VHa*_*avy 9

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

z = (w, eps, b)
Run Code Online (Sandbox Code Playgroud)

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

H = diag([ones(1, n), zeros(1, n + 1)])
Run Code Online (Sandbox Code Playgroud)

矢量f可表示为:

f = [zeros(1, n), C * ones(1, n), 0]'
Run Code Online (Sandbox Code Playgroud)

第一组约束变为:

Aineq = [A1, eye(n), zeros(n, 1)]
bineq = ones(n, 1)
Run Code Online (Sandbox Code Playgroud)

where A1是与原始形式相同的矩阵.

第二组约束成为下限:

lb = (inf(n, 1), zeros(n, 1), inf(n, 1))
Run Code Online (Sandbox Code Playgroud)

然后你可以调用MATLAB:

z = quadprog(H, f, Aineq, bineq, [], [], lb);
Run Code Online (Sandbox Code Playgroud)

PS我可能会在一些小细节上弄错,但总体思路是正确的.