/// <summary> Computes entropy after splitting without considering the /// class values. /// </summary> public double splitEnt(Distribution bags) { double returnValue = 0; int i; for (i = 0; i < bags.numBags(); i++) returnValue = returnValue + logFunc(bags.perBag(i)); return logFunc(bags.total()) - returnValue; }
/// <summary> Computes entropy of distribution after splitting.</summary> public double newEnt(Distribution bags) { double returnValue = 0; int i, j; for (i = 0; i < bags.numBags(); i++) { for (j = 0; j < bags.numClasses(); j++) returnValue = returnValue + logFunc(bags.perClassPerBag(i, j)); returnValue = returnValue - logFunc(bags.perBag(i)); } return - returnValue; }
/// <summary> Computes entropy of test distribution with respect to training distribution.</summary> public override double splitCritValue(Distribution train, Distribution test) { double result = 0; int numClasses = 0; int i, j; // Find out relevant number of classes for (j = 0; j < test.numClasses(); j++) if (Utils.gr(train.perClass(j), 0) || Utils.gr(test.perClass(j), 0)) numClasses++; // Compute entropy of test data with respect to training data for (i = 0; i < test.numBags(); i++) if (Utils.gr(test.perBag(i), 0)) { for (j = 0; j < test.numClasses(); j++) if (Utils.gr(test.perClassPerBag(i, j), 0)) result -= test.perClassPerBag(i, j) * System.Math.Log(train.perClassPerBag(i, j) + 1); result += test.perBag(i) * System.Math.Log(train.perBag(i) + numClasses); } return result / log2; }
/// <summary> Help method for computing the split entropy.</summary> private double splitEnt(Distribution bags, double totalnoInst) { double returnValue = 0; double noUnknown; int i; noUnknown = totalnoInst - bags.total(); if (Utils.gr(bags.total(), 0)) { for (i = 0; i < bags.numBags(); i++) returnValue = returnValue - logFunc(bags.perBag(i)); returnValue = returnValue - logFunc(noUnknown); returnValue = returnValue + logFunc(totalnoInst); } return returnValue; }