예제 #1
0
  @Override
  public void train(
      int[] numInputCategory, int[][] inputCategory, int numOutputClass, int[] outputClass)
      throws Exception {
    shuffleTrainingSet(inputCategory, outputClass);
    OfflineLearningNominalDataClassifier[] candidate = new OfflineLearningNominalDataClassifier[k];
    double[] accuracy = new double[k];
    int selected = 0;
    for (int i = 0; i < k; i++) {
      candidate[i] = classifier.copy();

      // pisah set menjadi tr dan cv
      ArrayList<int[]> trInputCategory = new ArrayList<int[]>();
      ArrayList<Integer> trOutputClass = new ArrayList<Integer>();
      ArrayList<int[]> cvInputCategory = new ArrayList<int[]>();
      ArrayList<Integer> cvOutputClass = new ArrayList<Integer>();
      for (int j = 0; j < i * inputCategory.length / k; j++) {
        trInputCategory.add(inputCategory[j]);
        trOutputClass.add(outputClass[j]);
      }
      for (int j = i * inputCategory.length / k; j < (i + 1) * inputCategory.length / k; j++) {
        cvInputCategory.add(inputCategory[j]);
        cvOutputClass.add(outputClass[j]);
      }
      for (int j = (i + 1) * inputCategory.length / k; j < inputCategory.length; j++) {
        trInputCategory.add(inputCategory[j]);
        trOutputClass.add(outputClass[j]);
      }
      candidate[i].train(
          numInputCategory,
          (int[][]) trInputCategory.toArray(new int[trInputCategory.size()][]),
          numOutputClass,
          trOutputClass.stream().mapToInt(Integer::intValue).toArray());
      accuracy[i] =
          calculateAccuracy(
              candidate[i],
              cvInputCategory.toArray(new int[cvInputCategory.size()][]),
              cvOutputClass.stream().mapToInt(Integer::intValue).toArray());
      if (accuracy[i] > accuracy[selected]) selected = i;
    }
    classifier = candidate[selected];
  }
예제 #2
0
 public kFold(int k, OfflineLearningNominalDataClassifier classifier) {
   this.k = k;
   this.classifier = classifier.copy();
 }