Ejemplo n.º 1
0
        // 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);
        }
Ejemplo n.º 2
0
 // 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;
 }
Ejemplo n.º 3
0
        // 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);
        }
Ejemplo n.º 4
0
        // 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);
        }