SVM支持向量机目标函数及参数训练过程说明解读

目标函数如下:

这个和线性可分支持向量机形式类似推导过程相同,区别在于利用拉格朗日求最优化值的时候,多了参数C和ksi,推导出来的约束条件alpha_i 从>=0  变成了0<= alpha_i <=C

SVM支持向量机目标函数及参数训练过程说明解读_第1张图片


对alpha_i 求导(梯度gradient可以由如下导数和约束推导得到):

含有不等式约束的KKT条件是SVM收敛的充分必要条件:如下式子也是训练停止的条件。

SVM支持向量机目标函数及参数训练过程说明解读_第2张图片


解释如下:当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进行二次规划优化极值

SVM支持向量机目标函数及参数训练过程说明解读_第3张图片

所以有如下式子:

画图如下,两个alpha的惩罚因子参数都为C

SVM支持向量机目标函数及参数训练过程说明解读_第4张图片

因为alpha_i 和alpha_j范围都是[0,C], 因此可以推导出来,对于y1!=y2的情况和y1==y2的情况,alpha值的上下边界值如下面式子所示:

(具体推导方法,可以正向推导也可以反向推导。)

SVM支持向量机目标函数及参数训练过程说明解读_第5张图片


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) 就是梯度公式。


SVM支持向量机目标函数及参数训练过程说明解读_第6张图片

在下面等价的公式中:Q11+Q22-2Q12 就是eta。 f1和f2的梯度就是上面的公式g(x)。

SVM支持向量机目标函数及参数训练过程说明解读_第7张图片

训练收敛条件就是KKT条件:即working_set_selection 函数的返回值的每一对值都满足如下条件,无法返回新的值。

训练的iteration会记录一共训练了多少轮达到了收敛条件。

SVM支持向量机目标函数及参数训练过程说明解读_第8张图片


(未完成待续)

你可能感兴趣的:(Algorithm)