private static void solve_nu_svr(svm_problem prob, svm_parameter param, double[] alpha, Solver.SolutionInfo si) { int l = prob.l; double C = param.C; var alpha2 = new double[2*l]; var linear_term = new double[2*l]; var y = new sbyte[2*l]; int i; double sum = C*param.nu*l/2; for (i = 0; i < l; i++) { alpha2[i] = alpha2[i + l] = Math.Min(sum, C); sum -= alpha2[i]; linear_term[i] = - prob.y[i]; y[i] = 1; linear_term[i + l] = prob.y[i]; y[i + l] = - 1; } var s = new Solver_NU(); s.Solve(2*l, new SVR_Q(prob, param), linear_term, y, alpha2, C, C, param.eps, si, param.shrinking); Console.Out.Write("epsilon = " + (- si.r) + "\n"); for (i = 0; i < l; i++) alpha[i] = alpha2[i] - alpha2[i + l]; }
private static void solve_nu_svc(svm_problem prob, svm_parameter param, double[] alpha, Solver.SolutionInfo si) { int i; int l = prob.l; double nu = param.nu; var y = new sbyte[l]; for (i = 0; i < l; i++) if (prob.y[i] > 0) y[i] = (+ 1); else y[i] = - 1; double sum_pos = nu*l/2; double sum_neg = nu*l/2; for (i = 0; i < l; i++) if (y[i] == + 1) { alpha[i] = Math.Min(1.0, sum_pos); sum_pos -= alpha[i]; } else { alpha[i] = Math.Min(1.0, sum_neg); sum_neg -= alpha[i]; } var zeros = new double[l]; for (i = 0; i < l; i++) zeros[i] = 0; var s = new Solver_NU(); s.Solve(l, new SVC_Q(prob, param, y), zeros, y, alpha, 1.0, 1.0, param.eps, si, param.shrinking); double r = si.r; Console.Out.Write("C = " + 1/r + "\n"); for (i = 0; i < l; i++) alpha[i] *= y[i]/r; si.rho /= r; si.obj /= (r*r); si.upper_bound_p = 1/r; si.upper_bound_n = 1/r; }