예제 #1
0
  // Compute scores for new leaf0 and leaf1, and add them to scoreList.
  private void computeNewLeafScores(SelectedSet selectedSet, int i, int j) {
    int NS = selectedSet.getN();
    for (int a = 0; a < NS; a++) {
      Individual individual = selectedSet.getIndividual(a);
      IGraph iterator = decisionGraphs[i].getGraph();
      while (!(iterator
          instanceof Leaf)) { // Iterator is a variable because we are still traversing the DG.
        int x = ((Variable) iterator).getVariable();
        char alleleX = individual.getAllele(x);
        if (alleleX == '0') {
          iterator = ((Variable) iterator).getZero();
        } else {
          iterator = ((Variable) iterator).getOne();
        }
      }
      int itrPosition = decisionGraphs[i].getLeafs().indexOf((Leaf) iterator);
      if (itrPosition == j || itrPosition == j + 1) { // We've reached one of the new leafs.
        int mZero = ((Leaf) iterator).getMZero();
        int mOne = ((Leaf) iterator).getMOne();
        if (mZero > 0 && mOne > 0) { // It's still "interesting" to split.
          char alleleI = individual.getAllele(i); // Value of Xi in individual a.
          for (int split : splitList[i]) {
            char alleleS = individual.getAllele(split); // Value of Xsplit in individual a.
            if (alleleI == '0') {
              if (alleleS == '0') {
                ((Leaf) iterator).addPossibleSplitFrequency(0, split); // m00[split]++;
              } else {
                ((Leaf) iterator).addPossibleSplitFrequency(1, split); // m01[split]++;
              }
            } else if (alleleS == '0') {
              ((Leaf) iterator).addPossibleSplitFrequency(2, split); // m10[split]++;
            } else {
              ((Leaf) iterator).addPossibleSplitFrequency(3, split); // m11[split]++;			
            }
          }
        }
      }
    }

    for (int a = 0; a <= 1; a++) {
      Leaf newLeaf =
          decisionGraphs[i].getLeaf(j + a); // The two new leafs are at positions 'j' and 'j+1'.
      int mZero = newLeaf.getMZero();
      int mOne = newLeaf.getMOne();
      if (mZero > 0 && mOne > 0) {
        for (int s : splitList[i]) {
          int m00 = newLeaf.getPossibleSplitFrequency(0, s);
          int m01 = newLeaf.getPossibleSplitFrequency(1, s);
          int m10 = newLeaf.getPossibleSplitFrequency(2, s);
          int m11 = newLeaf.getPossibleSplitFrequency(3, s);
          double scoreGain = bayesianMetric.computeScoreGain(mZero, mOne, m00, m01, m10, m11);
          newLeaf.setScoreGain(s, scoreGain);
          newLeaf.updateBestSplit(
              s,
              scoreGain); // Responsible for updating the value of the best split score gain in this
          // leaf.
        }
      }
    } // END: for(int a = 0 ...)
  } // END: computeNewLeafScores(...)
예제 #2
0
  private void initializeBN(SelectedSet selectedSet) {
    int NS = selectedSet.getN();
    int SIZE = selectedSet.getIndividual(0).getIndividual().length;
    this.bestScoreGain = Double.NEGATIVE_INFINITY;
    Individual[] individuals = selectedSet.getIndividuals();
    for (int i = 0; i < Problem.n; i++) { // Refresh the Bayesian Network structure.
      parentList[i] =
          new HashSet<Integer>(
              Problem.n); // Initial Capacity = stringSize; 	Default Load Factor = 0.75
      adjacencyList[i] =
          new HashSet<Integer>(
              Problem.n); // Initial Capacity = stringSize; 	Default Load Factor = 0.75
      splitList[i] =
          new HashSet<Integer>(
              2 * Problem.n); // Initial Capacity = 2*stringSize; Default Load Factor = 0.75
      for (int n = 0; n < Problem.n; n++) {
        if (n != i) {
          splitList[i].add(n);
        }
      }

      int mOne =
          selectedSet.getUniFrequencies(i); // Construct the initial single leaf decision graphs.
      int mZero = NS - mOne;
      Leaf newLeaf =
          new Leaf(
              0, -1, mZero, mOne,
              SIZE); // There is only a single leaf per variable, at depth 0, with side -1.
      if (mZero > 0
          && mOne
              > 0) { // If mZero = 0 or mOne = 0 there is no need to try any split with this leaf.
        for (int j = 0; j < NS; j++) {
          char alleleJI = individuals[j].getAllele(i); // Value of Xi in individual j.
          for (int s : splitList[i]) {
            char alleleS = individuals[j].getAllele(s); // Value of Xs in individual j.
            if (alleleJI == '0') {
              if (alleleS == '0') {
                newLeaf.addPossibleSplitFrequency(0, s); // m00[s]++;
              } else {
                newLeaf.addPossibleSplitFrequency(1, s); // m01[s]++;
              }
            } else if (alleleS == '0') {
              newLeaf.addPossibleSplitFrequency(2, s); // m10[s]++;
            } else {
              newLeaf.addPossibleSplitFrequency(3, s); // m11[s]++;
            }
          }
        }
        for (int s : splitList[i]) {
          int m00 = newLeaf.getPossibleSplitFrequency(0, s);
          int m01 = newLeaf.getPossibleSplitFrequency(1, s);
          int m10 = newLeaf.getPossibleSplitFrequency(2, s);
          int m11 = newLeaf.getPossibleSplitFrequency(3, s);
          double scoreGain = bayesianMetric.computeScoreGain(mZero, mOne, m00, m01, m10, m11);
          newLeaf.setScoreGain(s, scoreGain);
          newLeaf.updateBestSplit(
              s,
              scoreGain); // Responsible for updating the value of the best split score gain in this
          // leaf.
        }
      } // END: if(mZero > 0 ...)
      decisionGraphs[i] =
          new DecisionGraph(
              newLeaf); // Initially each graph as a single leaf and there are n-1 possible splits.
      decisionGraphs[i].updateBestLeaf();
      double scoreGain = decisionGraphs[i].getBestLeafScoreGain();
      if (scoreGain
          > this
              .bestScoreGain) { // Update the value of the global best score gain and position (DG).
        this.bestDecisionGraphPos = i;
        this.bestScoreGain = scoreGain;
      }
    } // END: for(int i = 0 ...)
  } // END: initializeBN(...)