// Return parameter of a Laplace distribution private static double svm_svr_probability(SvmProblem prob, SvmParameter param) { int i; int nr_fold = 5; double[] ymv = new double[prob.Lenght]; double mae = 0; var newparam = (SvmParameter)param.Clone(); newparam.Probability = false; CrossValidation(prob, newparam, nr_fold, ymv); for (i = 0; i < prob.Lenght; i++) { ymv[i] = prob.Y[i] - ymv[i]; mae += Math.Abs(ymv[i]); } mae /= prob.Lenght; double std = Math.Sqrt(2 * mae * mae); int count = 0; mae = 0; for (i = 0; i < prob.Lenght; i++) { if (Math.Abs(ymv[i]) > 5 * std) { count = count + 1; } else { mae += Math.Abs(ymv[i]); } } mae /= (prob.Lenght - count); Svm.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(SvmProblem prob, SvmParameter param, double Cp, double Cn, double[] probAB) { //int i; int nr_fold = 5; int[] perm = new int[prob.Lenght]; double[] dec_values = new double[prob.Lenght]; // random shuffle var rnd = new Random(); for (int i = 0; i < prob.Lenght; i++) perm[i] = i; for (int i = 0; i < prob.Lenght; i++) { int j = i + (int)(rnd.NextDouble() * (prob.Lenght - i)); //do { int _ = perm[i]; perm[i] = perm[j]; perm[j] = _; } while (false); Common.Swap(ref perm[i], ref perm[j]); } for (int i = 0; i < nr_fold; i++) { int begin = i * prob.Lenght / nr_fold; int end = (i + 1) * prob.Lenght / nr_fold; //int j; var subprobLenght = prob.Lenght - (end - begin); var subprob = new SvmProblem { X = new SvmNode[subprobLenght][], Y = new double[subprobLenght] }; int k = 0; for (int j = 0; j < begin; j++) { subprob.X[k] = prob.X[perm[j]]; subprob.Y[k] = prob.Y[perm[j]]; ++k; } for (int j = end; j < prob.Lenght; j++) { subprob.X[k] = prob.X[perm[j]]; subprob.Y[k] = prob.Y[perm[j]]; ++k; } int p_count = 0, n_count = 0; for (int j = 0; j < k; j++) if (subprob.Y[j] > 0) p_count++; else n_count++; if (p_count == 0 && n_count == 0) for (int j = begin; j < end; j++) dec_values[perm[j]] = 0; else if (p_count > 0 && n_count == 0) for (int j = begin; j < end; j++) dec_values[perm[j]] = 1; else if (p_count == 0 && n_count > 0) for (int j = begin; j < end; j++) dec_values[perm[j]] = -1; else { var subparam = (SvmParameter)param.Clone(); subparam.Probability = false; subparam.C = 1.0; subparam.WeightLabel = new int[2]; subparam.Weight = new double[2]; subparam.WeightLabel[0] = +1; subparam.WeightLabel[1] = -1; subparam.Weight[0] = Cp; subparam.Weight[1] = Cn; var submodel = Train(subprob, subparam); for (int j = begin; j < end; j++) { double[] dec_value = new double[1]; submodel.PredictValues(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.Label[0]; } } } sigmoid_train(prob.Lenght, dec_values, prob.Y, probAB); }
// Return parameter of a Laplace distribution private static double svm_svr_probability(SvmProblem prob, SvmParameter param) { int i; int nr_fold = 5; double[] ymv = new double[prob.Lenght]; double mae = 0; var newparam = (SvmParameter)param.Clone(); newparam.Probability = false; CrossValidation(prob, newparam, nr_fold, ymv); for (i = 0; i < prob.Lenght; i++) { ymv[i] = prob.Y[i] - ymv[i]; mae += Math.Abs(ymv[i]); } mae /= prob.Lenght; double std = Math.Sqrt(2 * mae * mae); int count = 0; mae = 0; for (i = 0; i < prob.Lenght; i++) if (Math.Abs(ymv[i]) > 5 * std) count = count + 1; else mae += Math.Abs(ymv[i]); mae /= (prob.Lenght - count); Svm.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(SvmProblem prob, SvmParameter param, double Cp, double Cn, double[] probAB) { //int i; int nr_fold = 5; int[] perm = new int[prob.Lenght]; double[] dec_values = new double[prob.Lenght]; // random shuffle var rnd = new Random(); for (int i = 0; i < prob.Lenght; i++) { perm[i] = i; } for (int i = 0; i < prob.Lenght; i++) { int j = i + (int)(rnd.NextDouble() * (prob.Lenght - i)); //do { int _ = perm[i]; perm[i] = perm[j]; perm[j] = _; } while (false); Common.Swap(ref perm[i], ref perm[j]); } for (int i = 0; i < nr_fold; i++) { int begin = i * prob.Lenght / nr_fold; int end = (i + 1) * prob.Lenght / nr_fold; //int j; var subprobLenght = prob.Lenght - (end - begin); var subprob = new SvmProblem { X = new SvmNode[subprobLenght][], Y = new double[subprobLenght] }; int k = 0; for (int j = 0; j < begin; j++) { subprob.X[k] = prob.X[perm[j]]; subprob.Y[k] = prob.Y[perm[j]]; ++k; } for (int j = end; j < prob.Lenght; j++) { subprob.X[k] = prob.X[perm[j]]; subprob.Y[k] = prob.Y[perm[j]]; ++k; } int p_count = 0, n_count = 0; for (int j = 0; j < k; j++) { if (subprob.Y[j] > 0) { p_count++; } else { n_count++; } } if (p_count == 0 && n_count == 0) { for (int j = begin; j < end; j++) { dec_values[perm[j]] = 0; } } else if (p_count > 0 && n_count == 0) { for (int j = begin; j < end; j++) { dec_values[perm[j]] = 1; } } else if (p_count == 0 && n_count > 0) { for (int j = begin; j < end; j++) { dec_values[perm[j]] = -1; } } else { var subparam = (SvmParameter)param.Clone(); subparam.Probability = false; subparam.C = 1.0; subparam.WeightLabel = new int[2]; subparam.Weight = new double[2]; subparam.WeightLabel[0] = +1; subparam.WeightLabel[1] = -1; subparam.Weight[0] = Cp; subparam.Weight[1] = Cn; var submodel = Train(subprob, subparam); for (int j = begin; j < end; j++) { double[] dec_value = new double[1]; submodel.PredictValues(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.Label[0]; } } } sigmoid_train(prob.Lenght, dec_values, prob.Y, probAB); }