SVM支持向量机目标函数及参数训练过程说明解读
目标函数如下:
这个和线性可分支持向量机形式类似推导过程相同,区别在于利用拉格朗日求最优化值的时候,多了参数C和ksi,推导出来的约束条件alpha_i 从>=0 变成了0<= alpha_i <=C
对alpha_i 求导(梯度gradient可以由如下导数和约束推导得到):
含有不等式约束的KKT条件是SVM收敛的充分必要条件:如下式子也是训练停止的条件。
解释如下:当alpha-i在范围内(0,C)时, 为支持向量,所以yi × w × Kernel(xi,xj) +b = 1, 在分割平面上。
当alpha-i==0时, 为正常的非支持向量,所以yi × w × Kernel(xi,xj) +b >= 1, 在分割平面外。
alpha-i ==C, 为C时,为软间隔内的向量,所以yi × w × Kernel(xi,xj) +b <= 1, 在分割平面内。
SMO方法----alpha-i 参数训练更新
目标函数转化成如下式子,每次取2个参数视为变量,其他alpha值视为固定值。针对alpha-i alpha-j进行二次规划优化极值
所以有如下式子:
画图如下,两个alpha的惩罚因子参数都为C
因为alpha_i 和alpha_j范围都是[0,C], 因此可以推导出来,对于y1!=y2的情况和y1==y2的情况,alpha值的上下边界值如下面式子所示:
(具体推导方法,可以正向推导也可以反向推导。)
alpha值的上下边界值更新代码如下:
// update alpha[i] and alpha[j], handle bounds carefully
float[] Q_i = Q.get_Q(i,active_size);
float[] Q_j = Q.get_Q(j,active_size);
double C_i = get_C(i);
double C_j = get_C(j);
double old_alpha_i = alpha[i];
double old_alpha_j = alpha[j];
if(y[i]!=y[j])// // all work makes ai and aj no less than 0, no more than c1 and c2
{
double quad_coef = QD[i]+QD[j]+2*Q_i[j];
if (quad_coef <= 0)
quad_coef = 1e-12;
double delta = (-G[i]-G[j])/quad_coef; // update the parameter ai/aj using gradient
double diff = alpha[i] - alpha[j];//mark diff as difference between ai- aj
alpha[i] += delta;
alpha[j] += delta;
if(diff > 0)// ai > aj
{
if(alpha[j] < 0) // aj less than low-bound
{
alpha[j] = 0; // make aj no less than low-bound
alpha[i] = diff; // make ai no less than low-bound. because diff > 0 && aj < 0
}
}
else
{
if(alpha[i] < 0)
{
alpha[i] = 0;
alpha[j] = -diff;// all work makes ai and aj no less than 0, no more than c1 and c2
}
}
if(diff > C_i - C_j)
{
if(alpha[i] > C_i)
{
alpha[i] = C_i;
alpha[j] = C_i - diff;
}
}
else
{
if(alpha[j] > C_j)
{
alpha[j] = C_j;
alpha[i] = C_j + diff;
}
}
}
alpha-i的正常梯度更新公式如下:g(x) 就是梯度公式。
在下面等价的公式中:Q11+Q22-2Q12 就是eta。 f1和f2的梯度就是上面的公式g(x)。
训练收敛条件就是KKT条件:即working_set_selection 函数的返回值的每一对值都满足如下条件,无法返回新的值。
训练的iteration会记录一共训练了多少轮达到了收敛条件。
(未完成待续)