コード例 #1
0
  /** Returns a model containing all support vectors, i.e. the examples with non-zero alphas. */
  private EvoSVMModel getModel(double[] alphas) {
    // calculate support vectors
    Iterator<Example> reader = exampleSet.iterator();
    List<SupportVector> supportVectors = new ArrayList<SupportVector>();
    int index = 0;
    while (reader.hasNext()) {
      double currentAlpha = alphas[index];
      Example currentExample = reader.next();
      if (currentAlpha != 0.0d) {
        double[] x = new double[exampleSet.getAttributes().size()];
        int a = 0;
        for (Attribute attribute : exampleSet.getAttributes())
          x[a++] = currentExample.getValue(attribute);
        supportVectors.add(new SupportVector(x, ys[index], currentAlpha));
      }
      index++;
    }

    // calculate all sum values
    double[] sum = new double[exampleSet.size()];
    reader = exampleSet.iterator();
    index = 0;
    while (reader.hasNext()) {
      Example current = reader.next();
      double[] x = new double[exampleSet.getAttributes().size()];
      int a = 0;
      for (Attribute attribute : exampleSet.getAttributes()) x[a++] = current.getValue(attribute);
      sum[index] = kernel.getSum(supportVectors, x);
      index++;
    }

    // calculate b (from Stefan's mySVM code)
    double bSum = 0.0d;
    int bCounter = 0;
    for (int i = 0; i < alphas.length; i++) {
      if ((ys[i] * alphas[i] - c < -IS_ZERO) && (ys[i] * alphas[i] > IS_ZERO)) {
        bSum += ys[i] - sum[i];
        bCounter++;
      } else if ((ys[i] * alphas[i] + c > IS_ZERO) && (ys[i] * alphas[i] < -IS_ZERO)) {
        bSum += ys[i] - sum[i];
        bCounter++;
      }
    }

    if (bCounter == 0) {
      // unlikely
      bSum = 0.0d;
      for (int i = 0; i < alphas.length; i++) {
        if ((ys[i] * alphas[i] < IS_ZERO) && (ys[i] * alphas[i] > -IS_ZERO)) {
          bSum += ys[i] - sum[i];
          bCounter++;
        }
      }
      if (bCounter == 0) {
        // even unlikelier
        bSum = 0.0d;
        for (int i = 0; i < alphas.length; i++) {
          bSum += ys[i] - sum[i];
          bCounter++;
        }
      }
    }
    return new EvoSVMModel(exampleSet, supportVectors, kernel, bSum / bCounter);
  }