protected double findSplitNumericNominal(int index) throws Exception {
  double bestVal=Double.MAX_VALUE, currVal, currCutPoint;
  int numMissing=0;
  double[] sum=new double[m_Instances.numClasses()];
  double[][] bestDist=new double[3][m_Instances.numClasses()];
  for (int i=0; i < m_Instances.numInstances(); i++) {
    Instance inst=m_Instances.instance(i);
    if (!inst.isMissing(index)) {
      m_Distribution[1][(int)inst.classValue()]+=inst.weight();
    }
 else {
      m_Distribution[2][(int)inst.classValue()]+=inst.weight();
      numMissing++;
    }
  }
  System.arraycopy(m_Distribution[1],0,sum,0,m_Instances.numClasses());
  for (int j=0; j < 3; j++) {
    System.arraycopy(m_Distribution[j],0,bestDist[j],0,m_Instances.numClasses());
  }
  m_Instances.sort(index);
  for (int i=0; i < m_Instances.numInstances() - (numMissing + 1); i++) {
    Instance inst=m_Instances.instance(i);
    Instance instPlusOne=m_Instances.instance(i + 1);
    m_Distribution[0][(int)inst.classValue()]+=inst.weight();
    m_Distribution[1][(int)inst.classValue()]-=inst.weight();
    if (inst.value(index) < instPlusOne.value(index)) {
      currCutPoint=(inst.value(index) + instPlusOne.value(index)) / 2.0;
      currVal=ContingencyTables.entropyConditionedOnRows(m_Distribution);
      if (currVal < bestVal) {
        m_SplitPoint=currCutPoint;
        bestVal=currVal;
        for (int j=0; j < 3; j++) {
          System.arraycopy(m_Distribution[j],0,bestDist[j],0,m_Instances.numClasses());
        }
      }
    }
  }
  if (numMissing == 0) {
    System.arraycopy(sum,0,bestDist[2],0,m_Instances.numClasses());
  }
  m_Distribution=bestDist;
  return bestVal;
}

protected double findSplitNumericNominal ( int index ) throws Exception { double bestVal = Double . MAX_VALUE , currVal , currCutPoint ; int numMissing = 0 ; double [ ] sum = new double [ m_Instances . numClasses ( ) ] ; double [ ] [ ] bestDist = new double [ 3 ] [ m_Instances . numClasses ( ) ] ; for ( int i = 0 ; i < m_Instances . numInstances ( ) ; i ++ ) { Instance inst = m_Instances . instance ( i ) ; if ( ! inst . isMissing ( index ) ) { m_Distribution [ 1 ] [ ( int ) inst . classValue ( ) ] += inst . weight ( ) ; } else { m_Distribution [ 2 ] [ ( int ) inst . classValue ( ) ] += inst . weight ( ) ; numMissing ++ ; } } System . arraycopy ( m_Distribution [ 1 ] , 0 , sum , 0 , m_Instances . numClasses ( ) ) ; for ( int j = 0 ; j < 3 ; j ++ ) { System . arraycopy ( m_Distribution [ j ] , 0 , bestDist [ j ] , 0 , m_Instances . numClasses ( ) ) ; } m_Instances . sort ( index ) ; for ( int i = 0 ; i < m_Instances . numInstances ( ) - ( numMissing + 1 ) ; i ++ ) { Instance inst = m_Instances . instance ( i ) ; Instance instPlusOne = m_Instances . instance ( i + 1 ) ; m_Distribution [ 0 ] [ ( int ) inst . classValue ( ) ] += inst . weight ( ) ; m_Distribution [ 1 ] [ ( int ) inst . classValue ( ) ] -= inst . weight ( ) ; if ( inst . value ( index ) < instPlusOne . value ( index ) ) { currCutPoint = ( inst . value ( index ) + instPlusOne . value ( index ) ) / 2.0 ; currVal = ContingencyTables . entropyConditionedOnRows ( m_Distribution ) ; if ( currVal < bestVal ) { m_SplitPoint = currCutPoint ; bestVal = currVal ; for ( int j = 0 ; j < 3 ; j ++ ) { System . arraycopy ( m_Distribution [ j ] , 0 , bestDist [ j ] , 0 , m_Instances . numClasses ( ) ) ; } } } } if ( numMissing == 0 ) { System . arraycopy ( sum , 0 , bestDist [ 2 ] , 0 , m_Instances . numClasses ( ) ) ; } m_Distribution = bestDist ; return bestVal ; }
finds best split for numeric attribute and nominal class and returns value .
