コード例 #1
0
    /// <summary>
    /// Determines the Range transform for the provided problem.
    /// </summary>
    /// <param name="prob">The Problem to analyze</param>
    /// <param name="lowerBound">The lower bound for scaling</param>
    /// <param name="upperBound">The upper bound for scaling</param>
    /// <returns>The Range transform for the problem</returns>
    public static RangeTransform Compute(svm_problem prob, double lowerBound, double upperBound) {
      // node indices must be ordered
      int maxIndex = prob.x.Select(arr => arr.Last().index).Max();

      double[] minVals = new double[maxIndex];
      double[] maxVals = new double[maxIndex];
      int[] count = new int[maxIndex];
      for (int i = 0; i < maxIndex; i++) {
        minVals[i] = double.MaxValue;
        maxVals[i] = double.MinValue;
        count[i] = 0;
      }
      for (int i = 0; i < prob.l; i++) {
        for (int j = 0; j < prob.x[i].Length; j++) {
          int index = prob.x[i][j].index - 1;
          double value = prob.x[i][j].value;
          minVals[index] = Math.Min(minVals[index], value);
          maxVals[index] = Math.Max(maxVals[index], value);
          count[index]++;
        }
      }
      for (int i = 0; i < maxIndex; i++) {
        if (count[i] == 0) {
          minVals[i] = 0;
          maxVals[i] = 0;
        }
      }
      return new RangeTransform(minVals, maxVals, lowerBound, upperBound);
    }
コード例 #2
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    //
    // Interface functions
    //
    public static svm_model svm_train(svm_problem prob, svm_parameter param) {
      svm_model model = new svm_model();
      model.param = param;

      if (param.svm_type == svm_parameter.ONE_CLASS ||
          param.svm_type == svm_parameter.EPSILON_SVR ||
          param.svm_type == svm_parameter.NU_SVR) {
        // regression or one-class-svm
        model.nr_class = 2;
        model.label = null;
        model.nSV = null;
        model.probA = null;
        model.probB = null;
        model.sv_coef = new double[1][];

        if (param.probability == 1 &&
            (param.svm_type == svm_parameter.EPSILON_SVR ||
             param.svm_type == svm_parameter.NU_SVR)) {
          model.probA = new double[1];
          model.probA[0] = svm_svr_probability(prob, param);
        }

        decision_function f = svm_train_one(prob, param, 0, 0);
        model.rho = new double[1];
        model.rho[0] = f.rho;

        int nSV = 0;
        int i;
        for (i = 0; i < prob.l; i++)
          if (Math.Abs(f.alpha[i]) > 0) ++nSV;
        model.l = nSV;
        model.SV = new svm_node[nSV][];
        model.sv_coef[0] = new double[nSV];
        int j = 0;
        for (i = 0; i < prob.l; i++)
          if (Math.Abs(f.alpha[i]) > 0) {
            model.SV[j] = prob.x[i];
            model.sv_coef[0][j] = f.alpha[i];
            ++j;
          }
      } else {
        // classification
        int l = prob.l;
        int[] tmp_nr_class = new int[1];
        int[][] tmp_label = new int[1][];
        int[][] tmp_start = new int[1][];
        int[][] tmp_count = new int[1][];
        int[] perm = new int[l];

        // group training data of the same class
        svm_group_classes(prob, tmp_nr_class, tmp_label, tmp_start, tmp_count, perm);
        int nr_class = tmp_nr_class[0];
        int[] label = tmp_label[0];
        int[] start = tmp_start[0];
        int[] count = tmp_count[0];

        if (nr_class == 1)
          svm.info("WARNING: training data in only one class. See README for details." + Environment.NewLine);

        svm_node[][] x = new svm_node[l][];
        int i;
        for (i = 0; i < l; i++)
          x[i] = prob.x[perm[i]];

        // calculate weighted C

        double[] weighted_C = new double[nr_class];
        for (i = 0; i < nr_class; i++)
          weighted_C[i] = param.C;
        for (i = 0; i < param.nr_weight; i++) {
          int j;
          for (j = 0; j < nr_class; j++)
            if (param.weight_label[i] == label[j])
              break;
          if (j == nr_class)
            Console.Error.WriteLine("WARNING: class label " + param.weight_label[i] +
                                    " specified in weight is not found");
          else
            weighted_C[j] *= param.weight[i];
        }

        // train k*(k-1)/2 models

        bool[] nonzero = new bool[l];
        for (i = 0; i < l; i++)
          nonzero[i] = false;
        decision_function[] f = new decision_function[nr_class * (nr_class - 1) / 2];

        double[] probA = null, probB = null;
        if (param.probability == 1) {
          probA = new double[nr_class * (nr_class - 1) / 2];
          probB = new double[nr_class * (nr_class - 1) / 2];
        }

        int p = 0;
        for (i = 0; i < nr_class; i++)
          for (int j = i + 1; j < nr_class; j++) {
            svm_problem sub_prob = new svm_problem();
            int si = start[i], sj = start[j];
            int ci = count[i], cj = count[j];
            sub_prob.l = ci + cj;
            sub_prob.x = new svm_node[sub_prob.l][];
            sub_prob.y = new double[sub_prob.l];
            int k;
            for (k = 0; k < ci; k++) {
              sub_prob.x[k] = x[si + k];
              sub_prob.y[k] = +1;
            }
            for (k = 0; k < cj; k++) {
              sub_prob.x[ci + k] = x[sj + k];
              sub_prob.y[ci + k] = -1;
            }

            if (param.probability == 1) {
              double[] probAB = new double[2];
              svm_binary_svc_probability(sub_prob, param, weighted_C[i], weighted_C[j], probAB);
              probA[p] = probAB[0];
              probB[p] = probAB[1];
            }

            f[p] = svm_train_one(sub_prob, param, weighted_C[i], weighted_C[j]);
            for (k = 0; k < ci; k++)
              if (!nonzero[si + k] && Math.Abs(f[p].alpha[k]) > 0)
                nonzero[si + k] = true;
            for (k = 0; k < cj; k++)
              if (!nonzero[sj + k] && Math.Abs(f[p].alpha[ci + k]) > 0)
                nonzero[sj + k] = true;
            ++p;
          }

        // build output

        model.nr_class = nr_class;

        model.label = new int[nr_class];
        for (i = 0; i < nr_class; i++)
          model.label[i] = label[i];

        model.rho = new double[nr_class * (nr_class - 1) / 2];
        for (i = 0; i < nr_class * (nr_class - 1) / 2; i++)
          model.rho[i] = f[i].rho;

        if (param.probability == 1) {
          model.probA = new double[nr_class * (nr_class - 1) / 2];
          model.probB = new double[nr_class * (nr_class - 1) / 2];
          for (i = 0; i < nr_class * (nr_class - 1) / 2; i++) {
            model.probA[i] = probA[i];
            model.probB[i] = probB[i];
          }
        } else {
          model.probA = null;
          model.probB = null;
        }

        int nnz = 0;
        int[] nz_count = new int[nr_class];
        model.nSV = new int[nr_class];
        for (i = 0; i < nr_class; i++) {
          int nSV = 0;
          for (int j = 0; j < count[i]; j++)
            if (nonzero[start[i] + j]) {
              ++nSV;
              ++nnz;
            }
          model.nSV[i] = nSV;
          nz_count[i] = nSV;
        }

        svm.info("Total nSV = " + nnz + Environment.NewLine);

        model.l = nnz;
        model.SV = new svm_node[nnz][];
        p = 0;
        for (i = 0; i < l; i++)
          if (nonzero[i]) model.SV[p++] = x[i];

        int[] nz_start = new int[nr_class];
        nz_start[0] = 0;
        for (i = 1; i < nr_class; i++)
          nz_start[i] = nz_start[i - 1] + nz_count[i - 1];

        model.sv_coef = new double[nr_class - 1][];
        for (i = 0; i < nr_class - 1; i++)
          model.sv_coef[i] = new double[nnz];

        p = 0;
        for (i = 0; i < nr_class; i++)
          for (int j = i + 1; j < nr_class; j++) {
            // classifier (i,j): coefficients with
            // i are in sv_coef[j-1][nz_start[i]...],
            // j are in sv_coef[i][nz_start[j]...]

            int si = start[i];
            int sj = start[j];
            int ci = count[i];
            int cj = count[j];

            int q = nz_start[i];
            int k;
            for (k = 0; k < ci; k++)
              if (nonzero[si + k])
                model.sv_coef[j - 1][q++] = f[p].alpha[k];
            q = nz_start[j];
            for (k = 0; k < cj; k++)
              if (nonzero[sj + k])
                model.sv_coef[i][q++] = f[p].alpha[ci + k];
            ++p;
          }
      }
      return model;
    }
コード例 #3
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    // label: label name, start: begin of each class, count: #data of classes, perm: indices to the original data
    // perm, length l, must be allocated before calling this subroutine
    private static void svm_group_classes(svm_problem prob, int[] nr_class_ret, int[][] label_ret, int[][] start_ret,
                                          int[][] count_ret, int[] perm) {
      int l = prob.l;
      int max_nr_class = 16;
      int nr_class = 0;
      int[] label = new int[max_nr_class];
      int[] count = new int[max_nr_class];
      int[] data_label = new int[l];
      int i;

      for (i = 0; i < l; i++) {
        int this_label = (int)(prob.y[i]);
        int j;
        for (j = 0; j < nr_class; j++) {
          if (this_label == label[j]) {
            ++count[j];
            break;
          }
        }
        data_label[i] = j;
        if (j == nr_class) {
          if (nr_class == max_nr_class) {
            max_nr_class *= 2;
            int[] new_data = new int[max_nr_class];
            Array.Copy(label, 0, new_data, 0, label.Length);
            label = new_data;
            new_data = new int[max_nr_class];
            Array.Copy(count, 0, new_data, 0, count.Length);
            count = new_data;
          }
          label[nr_class] = this_label;
          count[nr_class] = 1;
          ++nr_class;
        }
      }

      int[] start = new int[nr_class];
      start[0] = 0;
      for (i = 1; i < nr_class; i++)
        start[i] = start[i - 1] + count[i - 1];
      for (i = 0; i < l; i++) {
        perm[start[data_label[i]]] = i;
        ++start[data_label[i]];
      }
      start[0] = 0;
      for (i = 1; i < nr_class; i++)
        start[i] = start[i - 1] + count[i - 1];

      nr_class_ret[0] = nr_class;
      label_ret[0] = label;
      start_ret[0] = start;
      count_ret[0] = count;
    }
コード例 #4
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    // Return parameter of a Laplace distribution 
    private static double svm_svr_probability(svm_problem prob, svm_parameter param) {
      int i;
      int nr_fold = 5;
      double[] ymv = new double[prob.l];
      double mae = 0;

      svm_parameter newparam = (svm_parameter)param.Clone();
      newparam.probability = 0;
      svm_cross_validation(prob, newparam, nr_fold, ymv);
      for (i = 0; i < prob.l; i++) {
        ymv[i] = prob.y[i] - ymv[i];
        mae += Math.Abs(ymv[i]);
      }
      mae /= prob.l;
      double std = Math.Sqrt(2 * mae * mae);
      int count = 0;
      mae = 0;
      for (i = 0; i < prob.l; i++)
        if (Math.Abs(ymv[i]) > 5 * std)
          count = count + 1;
        else
          mae += Math.Abs(ymv[i]);
      mae /= (prob.l - count);
      svm.info("Prob. model for test data: target value = predicted value + z, " + Environment.NewLine
               + "z: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma=" + mae + Environment.NewLine);
      return mae;
    }
コード例 #5
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    // Cross-validation decision values for probability estimates
    private static void svm_binary_svc_probability(svm_problem prob, svm_parameter param, double Cp, double Cn,
                                                   double[] probAB) {
      int i;
      int nr_fold = 5;
      int[] perm = new int[prob.l];
      double[] dec_values = new double[prob.l];

      // random shuffle
      for (i = 0; i < prob.l; i++) perm[i] = i;
      for (i = 0; i < prob.l; i++) {
        int j = i + rand.Next(prob.l - i);
        {
          int _ = perm[i];
          perm[i] = perm[j];
          perm[j] = _;
        }
      }
      for (i = 0; i < nr_fold; i++) {
        int begin = i * prob.l / nr_fold;
        int end = (i + 1) * prob.l / nr_fold;
        int j, k;
        svm_problem subprob = new svm_problem();

        subprob.l = prob.l - (end - begin);
        subprob.x = new svm_node[subprob.l][];
        subprob.y = new double[subprob.l];

        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.l; 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 {
          svm_parameter subparam = (svm_parameter)param.Clone();
          subparam.probability = 0;
          subparam.C = 1.0;
          subparam.nr_weight = 2;
          subparam.weight_label = new int[2];
          subparam.weight = new double[2];
          subparam.weight_label[0] = +1;
          subparam.weight_label[1] = -1;
          subparam.weight[0] = Cp;
          subparam.weight[1] = Cn;
          svm_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.label[0];
          }
        }
      }
      sigmoid_train(prob.l, dec_values, prob.y, probAB);
    }
コード例 #6
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    private static decision_function svm_train_one(
      svm_problem prob, svm_parameter param,
      double Cp, double Cn) {
      double[] alpha = new double[prob.l];
      Solver.SolutionInfo si = new Solver.SolutionInfo();
      switch (param.svm_type) {
        case svm_parameter.C_SVC:
          solve_c_svc(prob, param, alpha, si, Cp, Cn);
          break;
        case svm_parameter.NU_SVC:
          solve_nu_svc(prob, param, alpha, si);
          break;
        case svm_parameter.ONE_CLASS:
          solve_one_class(prob, param, alpha, si);
          break;
        case svm_parameter.EPSILON_SVR:
          solve_epsilon_svr(prob, param, alpha, si);
          break;
        case svm_parameter.NU_SVR:
          solve_nu_svr(prob, param, alpha, si);
          break;
      }

      svm.info("obj = " + si.obj + ", rho = " + si.rho + Environment.NewLine);

      // output SVs

      int nSV = 0;
      int nBSV = 0;
      for (int i = 0; i < prob.l; i++) {
        if (Math.Abs(alpha[i]) > 0) {
          ++nSV;
          if (prob.y[i] > 0) {
            if (Math.Abs(alpha[i]) >= si.upper_bound_p)
              ++nBSV;
          } else {
            if (Math.Abs(alpha[i]) >= si.upper_bound_n)
              ++nBSV;
          }
        }
      }

      svm.info("nSV = " + nSV + ", nBSV = " + nBSV + Environment.NewLine);

      decision_function f = new decision_function();
      f.alpha = alpha;
      f.rho = si.rho;
      return f;
    }
コード例 #7
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    private static void solve_nu_svr(svm_problem prob, svm_parameter param,
                                     double[] alpha, Solver.SolutionInfo si) {
      int l = prob.l;
      double C = param.C;
      double[] alpha2 = new double[2 * l];
      double[] linear_term = new double[2 * l];
      short[] y = new short[2 * l];
      int i;

      double sum = C * param.nu * l / 2;
      for (i = 0; i < l; i++) {
        alpha2[i] = alpha2[i + l] = Math.Min(sum, C);
        sum -= alpha2[i];

        linear_term[i] = -prob.y[i];
        y[i] = 1;

        linear_term[i + l] = prob.y[i];
        y[i + l] = -1;
      }

      Solver_NU s = new Solver_NU();
      s.Solve(2 * l, new SVR_Q(prob, param), linear_term, y,
              alpha2, C, C, param.eps, si, param.shrinking);

      svm.info("epsilon = " + (-si.r) + Environment.NewLine);

      for (i = 0; i < l; i++)
        alpha[i] = alpha2[i] - alpha2[i + l];
    }
コード例 #8
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    private static void solve_one_class(svm_problem prob, svm_parameter param,
                                        double[] alpha, Solver.SolutionInfo si) {
      int l = prob.l;
      double[] zeros = new double[l];
      short[] ones = new short[l];
      int i;

      int n = (int)(param.nu * prob.l); // # of alpha's at upper bound

      for (i = 0; i < n; i++)
        alpha[i] = 1;
      if (n < prob.l)
        alpha[n] = param.nu * prob.l - n;
      for (i = n + 1; i < l; i++)
        alpha[i] = 0;

      for (i = 0; i < l; i++) {
        zeros[i] = 0;
        ones[i] = 1;
      }

      Solver s = new Solver();
      s.Solve(l, new ONE_CLASS_Q(prob, param), zeros, ones,
              alpha, 1.0, 1.0, param.eps, si, param.shrinking);
    }
コード例 #9
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    private static void solve_c_svc(svm_problem prob, svm_parameter param,
                                    double[] alpha, Solver.SolutionInfo si,
                                    double Cp, double Cn) {
      int l = prob.l;
      double[] minus_ones = new double[l];
      short[] y = new short[l];

      int i;

      for (i = 0; i < l; i++) {
        alpha[i] = 0;
        minus_ones[i] = -1;
        if (prob.y[i] > 0) y[i] = +1;
        else y[i] = -1;
      }

      Solver s = new Solver();
      s.Solve(l, new SVC_Q(prob, param, y), minus_ones, y,
              alpha, Cp, Cn, param.eps, si, param.shrinking);

      double sum_alpha = 0;
      for (i = 0; i < l; i++)
        sum_alpha += alpha[i];

      if (Cp == Cn)
        svm.info("nu = " + sum_alpha / (Cp * prob.l) + Environment.NewLine);

      for (i = 0; i < l; i++)
        alpha[i] *= y[i];
    }
コード例 #10
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    private static void solve_nu_svc(svm_problem prob, svm_parameter param,
                                     double[] alpha, Solver.SolutionInfo si) {
      int i;
      int l = prob.l;
      double nu = param.nu;

      short[] y = new short[l];

      for (i = 0; i < l; i++)
        if (prob.y[i] > 0)
          y[i] = +1;
        else
          y[i] = -1;

      double sum_pos = nu * l / 2;
      double sum_neg = nu * l / 2;

      for (i = 0; i < l; i++)
        if (y[i] == +1) {
          alpha[i] = Math.Min(1.0, sum_pos);
          sum_pos -= alpha[i];
        } else {
          alpha[i] = Math.Min(1.0, sum_neg);
          sum_neg -= alpha[i];
        }

      double[] zeros = new double[l];

      for (i = 0; i < l; i++)
        zeros[i] = 0;

      Solver_NU s = new Solver_NU();
      s.Solve(l, new SVC_Q(prob, param, y), zeros, y,
              alpha, 1.0, 1.0, param.eps, si, param.shrinking);
      double r = si.r;

      svm.info("C = " + 1 / r + Environment.NewLine);

      for (i = 0; i < l; i++)
        alpha[i] *= y[i] / r;

      si.rho /= r;
      si.obj /= (r * r);
      si.upper_bound_p = 1 / r;
      si.upper_bound_n = 1 / r;
    }
コード例 #11
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
 public SVR_Q(svm_problem prob, svm_parameter param)
   : base(prob.l, prob.x, param) {
   l = prob.l;
   cache = new Cache(l, (long)(param.cache_size * (1 << 20)));
   QD = new double[2 * l];
   sign = new short[2 * l];
   index = new int[2 * l];
   for (int k = 0; k < l; k++) {
     sign[k] = 1;
     sign[k + l] = -1;
     index[k] = k;
     index[k + l] = k;
     QD[k] = kernel_function(k, k);
     QD[k + l] = QD[k];
   }
   buffer = new float[2][];
   buffer[0] = new float[2 * l];
   buffer[1] = new float[2 * l];
   next_buffer = 0;
 }
コード例 #12
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
 public ONE_CLASS_Q(svm_problem prob, svm_parameter param)
   : base(prob.l, prob.x, param) {
   cache = new Cache(prob.l, (long)(param.cache_size * (1 << 20)));
   QD = new double[prob.l];
   for (int i = 0; i < prob.l; i++)
     QD[i] = kernel_function(i, i);
 }
コード例 #13
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
 public SVC_Q(svm_problem prob, svm_parameter param, short[] y_)
   : base(prob.l, prob.x, param) {
   y = (short[])y_.Clone();
   cache = new Cache(prob.l, (long)(param.cache_size * (1 << 20)));
   QD = new double[prob.l];
   for (int i = 0; i < prob.l; i++)
     QD[i] = kernel_function(i, i);
 }
コード例 #14
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    // Stratified cross validation
    public static void svm_cross_validation(svm_problem prob, svm_parameter param, int nr_fold, double[] target) {
      int i;
      int[] fold_start = new int[nr_fold + 1];
      int l = prob.l;
      int[] perm = new int[l];

      // stratified cv may not give leave-one-out rate
      // Each class to l folds -> some folds may have zero elements
      if ((param.svm_type == svm_parameter.C_SVC ||
           param.svm_type == svm_parameter.NU_SVC) && nr_fold < l) {
        int[] tmp_nr_class = new int[1];
        int[][] tmp_label = new int[1][];
        int[][] tmp_start = new int[1][];
        int[][] tmp_count = new int[1][];

        svm_group_classes(prob, tmp_nr_class, tmp_label, tmp_start, tmp_count, perm);

        int nr_class = tmp_nr_class[0];
        int[] start = tmp_start[0];
        int[] count = tmp_count[0];

        // random shuffle and then data grouped by fold using the array perm
        int[] fold_count = new int[nr_fold];
        int c;
        int[] index = new int[l];
        for (i = 0; i < l; i++)
          index[i] = perm[i];
        for (c = 0; c < nr_class; c++)
          for (i = 0; i < count[c]; i++) {
            int j = i + rand.Next(count[c] - i);
            {
              int _ = index[start[c] + j];
              index[start[c] + j] = index[start[c] + i];
              index[start[c] + i] = _;
            }
          }
        for (i = 0; i < nr_fold; i++) {
          fold_count[i] = 0;
          for (c = 0; c < nr_class; c++)
            fold_count[i] += (i + 1) * count[c] / nr_fold - i * count[c] / nr_fold;
        }
        fold_start[0] = 0;
        for (i = 1; i <= nr_fold; i++)
          fold_start[i] = fold_start[i - 1] + fold_count[i - 1];
        for (c = 0; c < nr_class; c++)
          for (i = 0; i < nr_fold; i++) {
            int begin = start[c] + i * count[c] / nr_fold;
            int end = start[c] + (i + 1) * count[c] / nr_fold;
            for (int j = begin; j < end; j++) {
              perm[fold_start[i]] = index[j];
              fold_start[i]++;
            }
          }
        fold_start[0] = 0;
        for (i = 1; i <= nr_fold; i++)
          fold_start[i] = fold_start[i - 1] + fold_count[i - 1];
      } else {
        for (i = 0; i < l; i++) perm[i] = i;
        for (i = 0; i < l; i++) {
          int j = i + rand.Next(l - i);
          {
            int _ = perm[i];
            perm[i] = perm[j];
            perm[j] = _;
          }
        }
        for (i = 0; i <= nr_fold; i++)
          fold_start[i] = i * l / nr_fold;
      }

      for (i = 0; i < nr_fold; i++) {
        int begin = fold_start[i];
        int end = fold_start[i + 1];
        int j, k;
        svm_problem subprob = new svm_problem();

        subprob.l = l - (end - begin);
        subprob.x = new svm_node[subprob.l][];
        subprob.y = new double[subprob.l];

        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 < l; j++) {
          subprob.x[k] = prob.x[perm[j]];
          subprob.y[k] = prob.y[perm[j]];
          ++k;
        }
        svm_model submodel = svm_train(subprob, param);
        if (param.probability == 1 &&
            (param.svm_type == svm_parameter.C_SVC ||
             param.svm_type == svm_parameter.NU_SVC)) {
          double[] prob_estimates = new double[svm_get_nr_class(submodel)];
          for (j = begin; j < end; j++)
            target[perm[j]] = svm_predict_probability(submodel, prob.x[perm[j]], prob_estimates);
        } else
          for (j = begin; j < end; j++)
            target[perm[j]] = svm_predict(submodel, prob.x[perm[j]]);
      }
    }
コード例 #15
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    private static void solve_epsilon_svr(svm_problem prob, svm_parameter param,
                                          double[] alpha, Solver.SolutionInfo si) {
      int l = prob.l;
      double[] alpha2 = new double[2 * l];
      double[] linear_term = new double[2 * l];
      short[] y = new short[2 * l];
      int i;

      for (i = 0; i < l; i++) {
        alpha2[i] = 0;
        linear_term[i] = param.p - prob.y[i];
        y[i] = 1;

        alpha2[i + l] = 0;
        linear_term[i + l] = param.p + prob.y[i];
        y[i + l] = -1;
      }

      Solver s = new Solver();
      s.Solve(2 * l, new SVR_Q(prob, param), linear_term, y,
              alpha2, param.C, param.C, param.eps, si, param.shrinking);

      double sum_alpha = 0;
      for (i = 0; i < l; i++) {
        alpha[i] = alpha2[i] - alpha2[i + l];
        sum_alpha += Math.Abs(alpha[i]);
      }
      svm.info("nu = " + sum_alpha / (param.C * l) + Environment.NewLine);
    }
コード例 #16
0
ファイル: SVM.cs プロジェクト: thunder176/HeuristicLab
    public static string svm_check_parameter(svm_problem prob, svm_parameter param) {
      // svm_type

      int svm_type = param.svm_type;
      if (svm_type != svm_parameter.C_SVC &&
         svm_type != svm_parameter.NU_SVC &&
         svm_type != svm_parameter.ONE_CLASS &&
         svm_type != svm_parameter.EPSILON_SVR &&
         svm_type != svm_parameter.NU_SVR)
        return "unknown svm type";

      // kernel_type, degree

      int kernel_type = param.kernel_type;
      if (kernel_type != svm_parameter.LINEAR &&
         kernel_type != svm_parameter.POLY &&
         kernel_type != svm_parameter.RBF &&
         kernel_type != svm_parameter.SIGMOID &&
         kernel_type != svm_parameter.PRECOMPUTED)
        return "unknown kernel type";

      if (param.gamma < 0)
        return "gamma < 0";

      if (param.degree < 0)
        return "degree of polynomial kernel < 0";

      // cache_size,eps,C,nu,p,shrinking

      if (param.cache_size <= 0)
        return "cache_size <= 0";

      if (param.eps <= 0)
        return "eps <= 0";

      if (svm_type == svm_parameter.C_SVC ||
         svm_type == svm_parameter.EPSILON_SVR ||
         svm_type == svm_parameter.NU_SVR)
        if (param.C <= 0)
          return "C <= 0";

      if (svm_type == svm_parameter.NU_SVC ||
         svm_type == svm_parameter.ONE_CLASS ||
         svm_type == svm_parameter.NU_SVR)
        if (param.nu <= 0 || param.nu > 1)
          return "nu <= 0 or nu > 1";

      if (svm_type == svm_parameter.EPSILON_SVR)
        if (param.p < 0)
          return "p < 0";

      if (param.shrinking != 0 &&
         param.shrinking != 1)
        return "shrinking != 0 and shrinking != 1";

      if (param.probability != 0 &&
         param.probability != 1)
        return "probability != 0 and probability != 1";

      if (param.probability == 1 &&
         svm_type == svm_parameter.ONE_CLASS)
        return "one-class SVM probability output not supported yet";

      // check whether nu-svc is feasible

      if (svm_type == svm_parameter.NU_SVC) {
        int l = prob.l;
        int max_nr_class = 16;
        int nr_class = 0;
        int[] label = new int[max_nr_class];
        int[] count = new int[max_nr_class];

        int i;
        for (i = 0; i < l; i++) {
          int this_label = (int)prob.y[i];
          int j;
          for (j = 0; j < nr_class; j++)
            if (this_label == label[j]) {
              ++count[j];
              break;
            }

          if (j == nr_class) {
            if (nr_class == max_nr_class) {
              max_nr_class *= 2;
              int[] new_data = new int[max_nr_class];
              Array.Copy(label, 0, new_data, 0, label.Length);
              label = new_data;

              new_data = new int[max_nr_class];
              Array.Copy(count, 0, new_data, 0, count.Length);
              count = new_data;
            }
            label[nr_class] = this_label;
            count[nr_class] = 1;
            ++nr_class;
          }
        }

        for (i = 0; i < nr_class; i++) {
          int n1 = count[i];
          for (int j = i + 1; j < nr_class; j++) {
            int n2 = count[j];
            if (param.nu * (n1 + n2) / 2 > Math.Min(n1, n2))
              return "specified nu is infeasible";
          }
        }
      }

      return null;
    }
コード例 #17
0
 /// <summary>
 /// Determines the Range transform for the provided problem.  Uses the default lower and upper bounds.
 /// </summary>
 /// <param name="prob">The Problem to analyze</param>
 /// <returns>The Range transform for the problem</returns>
 public static RangeTransform Compute(svm_problem prob) {
   return Compute(prob, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND);
 }