/// <summary> Computes entropy of distribution before splitting.</summary> public double oldEnt(Distribution bags) { double returnValue = 0; int j; for (j = 0; j < bags.numClasses(); j++) returnValue = returnValue + logFunc(bags.perClass(j)); 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> Creates distribution with two bags by merging all bags apart of /// the indicated one. /// </summary> public Distribution(Distribution toMerge, int index) { int i; totaL = toMerge.totaL; m_perClass = new double[toMerge.numClasses()]; Array.Copy(toMerge.m_perClass, 0, m_perClass, 0, toMerge.numClasses()); m_perClassPerBag = new double[2][]; for (int i2 = 0; i2 < 2; i2++) { m_perClassPerBag[i2] = new double[0]; } m_perClassPerBag[0] = new double[toMerge.numClasses()]; Array.Copy(toMerge.m_perClassPerBag[index], 0, m_perClassPerBag[0], 0, toMerge.numClasses()); m_perClassPerBag[1] = new double[toMerge.numClasses()]; for (i = 0; i < toMerge.numClasses(); i++) m_perClassPerBag[1][i] = toMerge.m_perClass[i] - m_perClassPerBag[0][i]; m_perBag = new double[2]; m_perBag[0] = toMerge.m_perBag[index]; m_perBag[1] = totaL - m_perBag[0]; }
/// <summary> Creates distribution with only one bag by merging all /// bags of given distribution. /// </summary> public Distribution(Distribution toMerge) { totaL = toMerge.totaL; m_perClass = new double[toMerge.numClasses()]; Array.Copy(toMerge.m_perClass, 0, m_perClass, 0, toMerge.numClasses()); m_perClassPerBag = new double[1][]; for (int i = 0; i < 1; i++) { m_perClassPerBag[i] = new double[0]; } m_perClassPerBag[0] = new double[toMerge.numClasses()]; Array.Copy(toMerge.m_perClass, 0, m_perClassPerBag[0], 0, toMerge.numClasses()); m_perBag = new double[1]; m_perBag[0] = totaL; }