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 DecisionFunction SvmTrainOne(SvmProblem prob, SvmParameter param, double cp, double cn) { double[] alpha = new double[prob.Count]; SvmSolver.SolutionInfo si = new SvmSolver.SolutionInfo(); switch (param.svmType) { case SvmType.CSvc: SolveCSvc(prob, param, alpha, si, cp, cn); break; case SvmType.NuSvc: SolveNuSvc(prob, param, alpha, si); break; case SvmType.OneClass: SolveOneClass(prob, param, alpha, si); break; case SvmType.EpsilonSvr: SolveEpsilonSvr(prob, param, alpha, si); break; case SvmType.NuSvr: SolveNuSvr(prob, param, alpha, si); break; } Info("obj = " + si.obj + ", rho = " + si.rho + "\n"); // output SVs int nSv = 0; int nBsv = 0; for (int i = 0; i < prob.Count; i++) { if (Math.Abs(alpha[i]) > 0) { ++nSv; if (prob.y[i] > 0) { if (Math.Abs(alpha[i]) >= si.upperBoundP) { ++nBsv; } } else { if (Math.Abs(alpha[i]) >= si.upperBoundN) { ++nBsv; } } } } Info("nSV = " + nSv + ", nBSV = " + nBsv + "\n"); DecisionFunction f = new DecisionFunction { alpha = alpha, rho = si.rho }; return(f); }
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 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 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 DecisionFunction SvmTrainOne(SvmProblem prob, SvmParameter param, double cp, double cn) { double[] alpha = new double[prob.Count]; SvmSolver.SolutionInfo si = new SvmSolver.SolutionInfo(); switch (param.svmType){ case SvmType.CSvc: SolveCSvc(prob, param, alpha, si, cp, cn); break; case SvmType.NuSvc: SolveNuSvc(prob, param, alpha, si); break; case SvmType.OneClass: SolveOneClass(prob, param, alpha, si); break; case SvmType.EpsilonSvr: SolveEpsilonSvr(prob, param, alpha, si); break; case SvmType.NuSvr: SolveNuSvr(prob, param, alpha, si); break; } Info("obj = " + si.obj + ", rho = " + si.rho + "\n"); // output SVs int nSv = 0; int nBsv = 0; for (int i = 0; i < prob.Count; i++){ if (Math.Abs(alpha[i]) > 0){ ++nSv; if (prob.y[i] > 0){ if (Math.Abs(alpha[i]) >= si.upperBoundP){ ++nBsv; } } else{ if (Math.Abs(alpha[i]) >= si.upperBoundN){ ++nBsv; } } } } Info("nSV = " + nSv + ", nBSV = " + nBsv + "\n"); DecisionFunction f = new DecisionFunction{alpha = alpha, rho = si.rho}; return f; }