/** * Computes average class values for each attribute and value * * @throws Exception */ private void computeAverageClassValues() throws Exception { double totalCounts, sum; M5Instance instance; double[] counts; double[][] avgClassValues = new double[getInputFormat().numAttributes()][0]; m_Indices = new int[getInputFormat().numAttributes()][0]; for (int j = 0; j < getInputFormat().numAttributes(); j++) { M5Attribute att = getInputFormat().attribute(j); if (att.isNominal()) { avgClassValues[j] = new double[att.numValues()]; counts = new double[att.numValues()]; for (int i = 0; i < getInputFormat().numInstances(); i++) { instance = getInputFormat().instance(i); if (!instance.classIsMissing() && (!instance.isMissing(j))) { counts[(int) instance.value(j)] += instance.weight(); avgClassValues[j][(int) instance.value(j)] += instance.weight() * instance.classValue(); } } sum = M5StaticUtils.sum(avgClassValues[j]); totalCounts = M5StaticUtils.sum(counts); if (M5StaticUtils.gr(totalCounts, 0)) { for (int k = 0; k < att.numValues(); k++) { if (M5StaticUtils.gr(counts[k], 0)) { avgClassValues[j][k] /= (double) counts[k]; } else { avgClassValues[j][k] = sum / (double) totalCounts; } } } m_Indices[j] = M5StaticUtils.sort(avgClassValues[j]); } } }