LIBSVM的SMO算法(update alpha)

来源:互联网 发布:监控软件手机版 编辑:程序博客网 时间:2024/09/21 08:15




// update alpha[i] and alpha[j], handle bounds carefullyconst Qfloat *Q_i = Q.get_Q(i,active_size);const Qfloat *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]){double quad_coef = QD[i]+QD[j]+2*Q_i[j];if (quad_coef <= 0)quad_coef = TAU;double delta = (-G[i]-G[j])/quad_coef;double diff = alpha[i] - alpha[j];alpha[i] += delta;alpha[j] += delta;if(diff > 0){if(alpha[j] < 0){alpha[j] = 0;alpha[i] = diff;}}else{if(alpha[i] < 0){alpha[i] = 0;alpha[j] = -diff;}}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;}}}else{double quad_coef = QD[i]+QD[j]-2*Q_i[j];if (quad_coef <= 0)quad_coef = TAU;double delta = (G[i]-G[j])/quad_coef;double sum = alpha[i] + alpha[j];alpha[i] -= delta;alpha[j] += delta;if(sum > C_i){if(alpha[i] > C_i){alpha[i] = C_i;alpha[j] = sum - C_i;}}else{if(alpha[j] < 0){alpha[j] = 0;alpha[i] = sum;}}if(sum > C_j){if(alpha[j] > C_j){alpha[j] = C_j;alpha[i] = sum - C_j;}}else{if(alpha[i] < 0){alpha[i] = 0;alpha[j] = sum;}}}



// update Gdouble delta_alpha_i = alpha[i] - old_alpha_i;double delta_alpha_j = alpha[j] - old_alpha_j;for(int k=0;k<active_size;k++){G[k] += Q_i[k]*delta_alpha_i + Q_j[k]*delta_alpha_j;}


0 0