in samoa-api/src/main/java/org/apache/samoa/moa/classifiers/core/attributeclassobservers/BinaryTreeNumericAttributeClassObserver.java [114:166]
protected AttributeSplitSuggestion searchForBestSplitOption(
Node currentNode, AttributeSplitSuggestion currentBestOption,
double[] actualParentLeft,
double[] parentLeft, double[] parentRight, boolean leftChild,
SplitCriterion criterion, double[] preSplitDist, int attIndex) {
if (currentNode == null) {
return currentBestOption;
}
DoubleVector leftDist = new DoubleVector();
DoubleVector rightDist = new DoubleVector();
if (parentLeft == null) {
leftDist.addValues(currentNode.classCountsLeft);
rightDist.addValues(currentNode.classCountsRight);
} else {
leftDist.addValues(parentLeft);
rightDist.addValues(parentRight);
if (leftChild) {
// get the exact statistics of the parent value
DoubleVector exactParentDist = new DoubleVector();
exactParentDist.addValues(actualParentLeft);
exactParentDist.subtractValues(currentNode.classCountsLeft);
exactParentDist.subtractValues(currentNode.classCountsRight);
// move the subtrees
leftDist.subtractValues(currentNode.classCountsRight);
rightDist.addValues(currentNode.classCountsRight);
// move the exact value from the parent
rightDist.addValues(exactParentDist);
leftDist.subtractValues(exactParentDist);
} else {
leftDist.addValues(currentNode.classCountsLeft);
rightDist.subtractValues(currentNode.classCountsLeft);
}
}
double[][] postSplitDists = new double[][] { leftDist.getArrayRef(),
rightDist.getArrayRef() };
double merit = criterion.getMeritOfSplit(preSplitDist, postSplitDists);
if ((currentBestOption == null) || (merit > currentBestOption.merit)) {
currentBestOption = new AttributeSplitSuggestion(
new NumericAttributeBinaryTest(attIndex,
currentNode.cut_point, true), postSplitDists, merit);
}
currentBestOption = searchForBestSplitOption(currentNode.left,
currentBestOption, currentNode.classCountsLeft.getArrayRef(), postSplitDists[0], postSplitDists[1], true,
criterion, preSplitDist, attIndex);
currentBestOption = searchForBestSplitOption(currentNode.right,
currentBestOption, currentNode.classCountsLeft.getArrayRef(), postSplitDists[0], postSplitDists[1], false,
criterion, preSplitDist, attIndex);
return currentBestOption;
}