use*_*334 7 matlab machine-learning svm quadprog
假设我们都给出了训练数据集{y?, x?},对i = 1, ..., n,其中y?既可以是-1或1并且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模型,因此是一个约束最小化问题,其中未知数是w和b.我们也可以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直接解决原始形式而无需将其转换为双重形式.
我不明白这是怎么回事.让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我可能会在一些小细节上弄错,但总体思路是正确的.