/*********************************************************************** This file is part of KEEL-software, the Data Mining tool for regression, classification, clustering, pattern mining and so on. Copyright (C) 2004-2010 F. Herrera (herrera@decsai.ugr.es) L. S�nchez (luciano@uniovi.es) J. Alcal�-Fdez (jalcala@decsai.ugr.es) S. Garc�a (sglopez@ujaen.es) A. Fern�ndez (alberto.fernandez@ujaen.es) J. Luengo (julianlm@decsai.ugr.es) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ **********************************************************************/ /** * <p> * @author Written by Jaume Bacardit (La Salle, Ram�n Llull University - Barcelona) 28/03/2004 * @author Modified by Xavi Sol� (La Salle, Ram�n Llull University - Barcelona) 23/12/2008 * @version 1.1 * @since JDK1.2 * </p> */ package keel.Algorithms.Genetic_Rule_Learning.MPLCS; import keel.Algorithms.Genetic_Rule_Learning.MPLCS.Assistant.Globals.*; public class Statistics { /** * <p> * Computes and stores several statistics about the learning process * </p> */ public static double[] averageFitness; public static double[] averageAccuracy; public static double[] bestAccuracy; public static double[] bestRules; public static double[] bestAliveRules; public static double[] averageNumRules; public static double[] averageNumRulesUtils; public static int iterationsSinceBest = 0; public static double bestFitness; public static double last10IterationsAccuracyAverage; public static int countStatistics = 0; public static void resetBestStats() { iterationsSinceBest = 0; } public static int getIterationsSinceBest() { return iterationsSinceBest; } public static void bestOfIteration(double itBestFit) { if (iterationsSinceBest == 0) { bestFitness = itBestFit; iterationsSinceBest++; } else { boolean newBest = false; if (Parameters.useMDL) { if (itBestFit < bestFitness) { newBest = true; } } else { if (itBestFit > bestFitness) { newBest = true; } } if (newBest) { bestFitness = itBestFit; iterationsSinceBest = 1; } else { iterationsSinceBest++; } } int i = countStatistics - 9; if (i < 0) { i = 0; } int max = countStatistics + 1; int num = max - i; last10IterationsAccuracyAverage = 0; for (; i < max; i++) { last10IterationsAccuracyAverage += bestAccuracy[i]; } last10IterationsAccuracyAverage /= (double) num; } public static void initStatistics() { Chronometer.startChronStatistics(); int numStatistics = Parameters.numIterations; averageFitness = new double[numStatistics]; averageAccuracy = new double[numStatistics]; bestAccuracy = new double[numStatistics]; bestRules = new double[numStatistics]; bestAliveRules = new double[numStatistics]; averageNumRules = new double[numStatistics]; averageNumRulesUtils = new double[numStatistics]; Chronometer.stopChronStatistics(); } public static void statisticsToFile() { FileManagement file = new FileManagement(); int length = countStatistics; String line; String lineToWrite = ""; try { //file.initWrite("NumRules.txt"); //TODO //file.closeWrite(); } catch (Exception e) { LogManager.println("Error in statistics file"); } } public static void computeStatistics(Classifier[] _population) { Chronometer.startChronStatistics(); int populationLength = Parameters.popSize; Classifier classAct; double sumFitness = 0; double sumAccuracy = 0; double sumNumRules = 0; double sumNumRulesUtils = 0; for (int i = 0; i < populationLength; i++) { classAct = _population[i]; sumFitness += classAct.getFitness(); sumAccuracy += classAct.getAccuracy(); sumNumRules += classAct.getNumRules(); sumNumRulesUtils += classAct.getNumAliveRules(); } sumFitness = sumFitness / populationLength; sumAccuracy = sumAccuracy / populationLength; sumNumRules = sumNumRules / populationLength; sumNumRulesUtils = sumNumRulesUtils / populationLength; Statistics.averageFitness[countStatistics] = sumFitness; Statistics.averageAccuracy[countStatistics] = sumAccuracy; Statistics.averageNumRules[countStatistics] = sumNumRules; Statistics.averageNumRulesUtils[countStatistics] = sumNumRulesUtils; Classifier best = PopulationWrapper.getBest(_population); LogManager.println("Best of iteration " + countStatistics + " : " + best.getAccuracy() + " " + best.getFitness() + " " + best.getNumRules() + "(" + best.getNumAliveRules() + ")"); Statistics.bestAccuracy[countStatistics] = best.getAccuracy(); Statistics.bestRules[countStatistics] = best.getNumRules(); Statistics.bestAliveRules[countStatistics] = best.getNumAliveRules(); bestOfIteration(best.getFitness()); countStatistics++; Chronometer.stopChronStatistics(); } }