示例#1
0
        // 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);
        }
示例#2
0
        // 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);
        }
示例#3
0
        // 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;
        }
示例#4
0
        // 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);
        }