private static void SolveEpsilonSvr(SvmProblem prob, SvmParameter param, IList <double> alpha, SvmSolver.SolutionInfo si) { int l = prob.Count; double[] alpha2 = new double[2 * l]; double[] linearTerm = new double[2 * l]; short[] y = new short[2 * l]; int i; for (i = 0; i < l; i++) { alpha2[i] = 0; linearTerm[i] = param.p - prob.y[i]; y[i] = 1; alpha2[i + l] = 0; linearTerm[i + l] = param.p + prob.y[i]; y[i + l] = -1; } SvmSolver s = new SvmSolver(); s.Solve(2 * l, new SvrQ(prob, param), linearTerm, y, alpha2, param.c, param.c, param.eps, si, param.shrinking); double sumAlpha = 0; for (i = 0; i < l; i++) { alpha[i] = alpha2[i] - alpha2[i + l]; sumAlpha += Math.Abs(alpha[i]); } Info("nu = " + sumAlpha / (param.c * l) + "\n"); }
private static void SolveOneClass(SvmProblem prob, SvmParameter param, double[] alpha, SvmSolver.SolutionInfo si) { int l = prob.Count; double[] zeros = new double[l]; short[] ones = new short[l]; int i; int n = (int)(param.nu * prob.Count); // # of alpha's at upper bound for (i = 0; i < n; i++) { alpha[i] = 1; } if (n < prob.Count) { alpha[n] = param.nu * prob.Count - n; } for (i = n + 1; i < l; i++) { alpha[i] = 0; } for (i = 0; i < l; i++) { zeros[i] = 0; ones[i] = 1; } SvmSolver s = new SvmSolver(); s.Solve(l, new OneClassQ(prob, param), zeros, ones, alpha, 1.0, 1.0, param.eps, si, param.shrinking); }
private static void SolveCSvc(SvmProblem prob, SvmParameter param, double[] alpha, SvmSolver.SolutionInfo si, double cp, double cn) { int l = prob.Count; double[] minusOnes = new double[l]; short[] y = new short[l]; int i; for (i = 0; i < l; i++) { alpha[i] = 0; minusOnes[i] = -1; if (prob.y[i] > 0) { y[i] = +1; } else { y[i] = -1; } } SvmSolver s = new SvmSolver(); s.Solve(l, new SvcQ(prob, param, y), minusOnes, y, alpha, cp, cn, param.eps, si, param.shrinking); double sumAlpha = 0; for (i = 0; i < l; i++) { sumAlpha += alpha[i]; } if (cp == cn) { Info("nu = " + sumAlpha / (cp * prob.Count) + "\n"); } for (i = 0; i < l; i++) { alpha[i] *= y[i]; } }
private static void SolveOneClass(SvmProblem prob, SvmParameter param, double[] alpha, SvmSolver.SolutionInfo si) { int l = prob.Count; double[] zeros = new double[l]; short[] ones = new short[l]; int i; int n = (int) (param.nu*prob.Count); // # of alpha's at upper bound for (i = 0; i < n; i++){ alpha[i] = 1; } if (n < prob.Count){ alpha[n] = param.nu*prob.Count - n; } for (i = n + 1; i < l; i++){ alpha[i] = 0; } for (i = 0; i < l; i++){ zeros[i] = 0; ones[i] = 1; } SvmSolver s = new SvmSolver(); s.Solve(l, new OneClassQ(prob, param), zeros, ones, alpha, 1.0, 1.0, param.eps, si, param.shrinking); }
private static void SolveNuSvr(SvmProblem prob, SvmParameter param, IList<double> alpha, SvmSolver.SolutionInfo si) { int l = prob.Count; double c = param.c; double[] alpha2 = new double[2*l]; double[] linearTerm = new double[2*l]; short[] y = new short[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]; linearTerm[i] = -prob.y[i]; y[i] = 1; linearTerm[i + l] = prob.y[i]; y[i + l] = -1; } SvmSolverNu s = new SvmSolverNu(); s.Solve(2*l, new SvrQ(prob, param), linearTerm, y, alpha2, c, c, param.eps, si, param.shrinking); Info("epsilon = " + (-si.r) + "\n"); for (i = 0; i < l; i++){ alpha[i] = alpha2[i] - alpha2[i + l]; } }
private static void SolveNuSvc(SvmProblem prob, SvmParameter param, double[] alpha, SvmSolver.SolutionInfo si) { int i; int l = prob.Count; double nu = param.nu; short[] y = new short[l]; for (i = 0; i < l; i++){ if (prob.y[i] > 0){ y[i] = +1; } else{ y[i] = -1; } } double sumPos = nu*l/2; double sumNeg = nu*l/2; for (i = 0; i < l; i++){ if (y[i] == +1){ alpha[i] = Math.Min(1.0, sumPos); sumPos -= alpha[i]; } else{ alpha[i] = Math.Min(1.0, sumNeg); sumNeg -= alpha[i]; } } double[] zeros = new double[l]; for (i = 0; i < l; i++){ zeros[i] = 0; } SvmSolverNu s = new SvmSolverNu(); s.Solve(l, new SvcQ(prob, param, y), zeros, y, alpha, 1.0, 1.0, param.eps, si, param.shrinking); double r = si.r; Info("C = " + 1/r + "\n"); for (i = 0; i < l; i++){ alpha[i] *= y[i]/r; } si.rho /= r; si.obj /= (r*r); si.upperBoundP = 1/r; si.upperBoundN = 1/r; }
private static void SolveEpsilonSvr(SvmProblem prob, SvmParameter param, IList<double> alpha, SvmSolver.SolutionInfo si) { int l = prob.Count; double[] alpha2 = new double[2*l]; double[] linearTerm = new double[2*l]; short[] y = new short[2*l]; int i; for (i = 0; i < l; i++){ alpha2[i] = 0; linearTerm[i] = param.p - prob.y[i]; y[i] = 1; alpha2[i + l] = 0; linearTerm[i + l] = param.p + prob.y[i]; y[i + l] = -1; } SvmSolver s = new SvmSolver(); s.Solve(2*l, new SvrQ(prob, param), linearTerm, y, alpha2, param.c, param.c, param.eps, si, param.shrinking); double sumAlpha = 0; for (i = 0; i < l; i++){ alpha[i] = alpha2[i] - alpha2[i + l]; sumAlpha += Math.Abs(alpha[i]); } Info("nu = " + sumAlpha/(param.c*l) + "\n"); }
private static void SolveCSvc(SvmProblem prob, SvmParameter param, double[] alpha, SvmSolver.SolutionInfo si, double cp, double cn) { int l = prob.Count; double[] minusOnes = new double[l]; short[] y = new short[l]; int i; for (i = 0; i < l; i++){ alpha[i] = 0; minusOnes[i] = -1; if (prob.y[i] > 0){ y[i] = +1; } else{ y[i] = -1; } } SvmSolver s = new SvmSolver(); s.Solve(l, new SvcQ(prob, param, y), minusOnes, y, alpha, cp, cn, param.eps, si, param.shrinking); double sumAlpha = 0; for (i = 0; i < l; i++){ sumAlpha += alpha[i]; } if (cp == cn){ Info("nu = " + sumAlpha/(cp*prob.Count) + "\n"); } for (i = 0; i < l; i++){ alpha[i] *= y[i]; } }