// Return parameter of a Laplace distribution internal static double SvmSvrProbability(SvmProblem prob, SvmParameter param) { int i; const int nrFold = 5; double[] ymv = new double[prob.Count]; double mae = 0; SvmParameter newparam = (SvmParameter)param.Clone(); newparam.probability = false; SvmCrossValidation(prob, newparam, nrFold, 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); Info( "Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma=" + mae + "\n"); return(mae); }
// Return parameter of a Laplace distribution internal static double SvmSvrProbability(SvmProblem prob, SvmParameter param) { int i; const int nrFold = 5; double[] ymv = new double[prob.Count]; double mae = 0; SvmParameter newparam = (SvmParameter) param.Clone(); newparam.probability = false; SvmCrossValidation(prob, newparam, nrFold, 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); 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 internal static void SvmBinarySvcProbability(SvmProblem prob, SvmParameter param, double cp, double cn, IList <double> probAb) { int i; const int nrFold = 5; int[] perm = new int[prob.Count]; double[] decValues = new double[prob.Count]; // random shuffle for (i = 0; i < prob.Count; i++) { perm[i] = i; } for (i = 0; i < prob.Count; i++) { int j = i + rand.Next(prob.Count - i); do { int _ = perm[i]; perm[i] = perm[j]; perm[j] = _; } while (false); } for (i = 0; i < nrFold; i++) { int begin = i * prob.Count / nrFold; int end = (i + 1) * prob.Count / nrFold; int j; int count = prob.Count - (end - begin); SvmProblem subprob = new SvmProblem { x = new BaseVector[count], y = new float[count] }; int 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 pCount = 0, nCount = 0; for (j = 0; j < k; j++) { if (subprob.y[j] > 0) { pCount++; } else { nCount++; } } if (pCount == 0 && nCount == 0) { for (j = begin; j < end; j++) { decValues[perm[j]] = 0; } } else if (pCount > 0 && nCount == 0) { for (j = begin; j < end; j++) { decValues[perm[j]] = 1; } } else if (pCount == 0 && nCount > 0) { for (j = begin; j < end; j++) { decValues[perm[j]] = -1; } } else { SvmParameter subparam = (SvmParameter)param.Clone(); subparam.probability = false; subparam.c = 1.0; subparam.nrWeight = 2; 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; SvmModel submodel = SvmTrain(subprob, subparam); for (j = begin; j < end; j++) { double[] decValue = new double[1]; SvmPredictValues(submodel, prob.x[perm[j]], decValue); decValues[perm[j]] = decValue[0]; // ensure +1 -1 order; reason not using CV subroutine decValues[perm[j]] *= submodel.label[0]; } } } SigmoidTrain(prob.Count, decValues, prob.y, probAb); }
// Cross-validation decision values for probability estimates internal static void SvmBinarySvcProbability(SvmProblem prob, SvmParameter param, double cp, double cn, IList<double> probAb) { int i; const int nrFold = 5; int[] perm = new int[prob.Count]; double[] decValues = new double[prob.Count]; // random shuffle for (i = 0; i < prob.Count; i++){ perm[i] = i; } for (i = 0; i < prob.Count; i++){ int j = i + rand.Next(prob.Count - i); do{ int _ = perm[i]; perm[i] = perm[j]; perm[j] = _; } while (false); } for (i = 0; i < nrFold; i++){ int begin = i*prob.Count/nrFold; int end = (i + 1)*prob.Count/nrFold; int j; int count = prob.Count - (end - begin); SvmProblem subprob = new SvmProblem{x = new BaseVector[count], y = new float[count]}; int 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 pCount = 0, nCount = 0; for (j = 0; j < k; j++){ if (subprob.y[j] > 0){ pCount++; } else{ nCount++; } } if (pCount == 0 && nCount == 0){ for (j = begin; j < end; j++){ decValues[perm[j]] = 0; } } else if (pCount > 0 && nCount == 0){ for (j = begin; j < end; j++){ decValues[perm[j]] = 1; } } else if (pCount == 0 && nCount > 0){ for (j = begin; j < end; j++){ decValues[perm[j]] = -1; } } else{ SvmParameter subparam = (SvmParameter) param.Clone(); subparam.probability = false; subparam.c = 1.0; subparam.nrWeight = 2; 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; SvmModel submodel = SvmTrain(subprob, subparam); for (j = begin; j < end; j++){ double[] decValue = new double[1]; SvmPredictValues(submodel, prob.x[perm[j]], decValue); decValues[perm[j]] = decValue[0]; // ensure +1 -1 order; reason not using CV subroutine decValues[perm[j]] *= submodel.label[0]; } } } SigmoidTrain(prob.Count, decValues, prob.y, probAb); }