// Return parameter of a Laplace distribution private static double svm_svr_probability(Problem prob, Parameter param) { int i; int nr_fold = 5; double[] ymv = new double[prob.Count]; double mae = 0; Parameter newparam = (Parameter)param.Clone(); newparam.Probability = false; svm_cross_validation(prob, newparam, nr_fold, ymv); for (i = 0; i < prob.Count; i++) { ymv[i] = prob.Y[i] - ymv[i]; mae += Math.Abs(ymv[i]); } mae /= prob.Count; double std = Math.Sqrt(2 * mae * mae); int count = 0; mae = 0; for (i = 0; i < prob.Count; i++) if (Math.Abs(ymv[i]) > 5 * std) count = count + 1; else mae += Math.Abs(ymv[i]); mae /= (prob.Count - count); Procedures.info("Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma=" + mae + "\n"); return mae; }
// Cross-validation decision values for probability estimates private static void svm_binary_svc_probability(Problem prob, Parameter param, double Cp, double Cn, double[] probAB) { int i; int nr_fold = 5; int[] perm = new int[prob.Count]; double[] dec_values = new double[prob.Count]; // random shuffle Random rand = new Random(); for (i = 0; i < prob.Count; i++) perm[i] = i; for (i = 0; i < prob.Count; i++) { int j = i + (int)(rand.NextDouble() * (prob.Count - i)); do { int _ = perm[i]; perm[i] = perm[j]; perm[j] = _; } while (false); } for (i = 0; i < nr_fold; i++) { int begin = i * prob.Count / nr_fold; int end = (i + 1) * prob.Count / nr_fold; int j, k; Problem subprob = new Problem(); subprob.Count = prob.Count - (end - begin); subprob.X = new Node[subprob.Count][]; subprob.Y = new double[subprob.Count]; k = 0; for (j = 0; j < begin; j++) { subprob.X[k] = prob.X[perm[j]]; subprob.Y[k] = prob.Y[perm[j]]; ++k; } for (j = end; j < prob.Count; j++) { subprob.X[k] = prob.X[perm[j]]; subprob.Y[k] = prob.Y[perm[j]]; ++k; } int p_count = 0, n_count = 0; for (j = 0; j < k; j++) if (subprob.Y[j] > 0) p_count++; else n_count++; if (p_count == 0 && n_count == 0) for (j = begin; j < end; j++) dec_values[perm[j]] = 0; else if (p_count > 0 && n_count == 0) for (j = begin; j < end; j++) dec_values[perm[j]] = 1; else if (p_count == 0 && n_count > 0) for (j = begin; j < end; j++) dec_values[perm[j]] = -1; else { Parameter subparam = (Parameter)param.Clone(); subparam.Probability = false; subparam.C = 1.0; subparam.Weights[1] = Cp; subparam.Weights[-1] = Cn; Model submodel = svm_train(subprob, subparam); for (j = begin; j < end; j++) { double[] dec_value = new double[1]; svm_predict_values(submodel, prob.X[perm[j]], dec_value); dec_values[perm[j]] = dec_value[0]; // ensure +1 -1 order; reason not using CV subroutine dec_values[perm[j]] *= submodel.ClassLabels[0]; } } } sigmoid_train(prob.Count, dec_values, prob.Y, probAB); }