/*********************************************************************** 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/ **********************************************************************/ package keel.Algorithms.Subgroup_Discovery.aprioriSD; import java.util.LinkedList; /** * <p>Titulo: Regla</p> * * <p>Descripcion: Contiene la estructura de datos de una regla en particular</p> * * <p>Copyright: Alberto Copyright (c) 2006</p> * * <p>Compa�ia: Mi casa</p> * * @author Alber * @version 1.0 */ public class Regla implements Comparable { private int[] antecedente; private int[] posiciones; private int clase; //la clase que se deriva de la regla private int support; private double heuristica; private int nClases; private int distrib[]; //contiene n� muestras por clase que satisfacen antecedente private String [] nombreAtributos; /** * Compara dos reglas * @param o Object Regla a comparar * @return int 0 si las reglas son iguales. 1 si esta regla es mejor. -1 si es peor */ public int compareTo(Object o) { Regla r2 = (Regla) o; int sal = 0; if (heuristica == r2.getHeuristica() && this.size() == r2.size()) { //Iguales sal = 0; } else if (heuristica == r2.getHeuristica() && this.size() < r2.size()) { sal = 1; } else if (heuristica == r2.getHeuristica() && this.size() > r2.size()) { sal = -1; } else if (heuristica > r2.getHeuristica()) { sal = 1; } else if (heuristica < r2.getHeuristica()) { sal = -1; } return (sal); } /** * Constructor por defecto. Asigna el valor 0 a la regla 0 */ public Regla() { antecedente = new int[1]; antecedente[0] = 0; clase = 0; } /** * Constructor * @param tam int Tama�o del antecedente * @param nClases int Numero de clases del problema */ public Regla(int tam, int nClases) { antecedente = new int[tam]; posiciones = new int[tam]; this.nClases = nClases; distrib = new int[nClases]; for (int i = 0; i < nClases; i++) { distrib[i] = 0; } clase = 0; } /** * Constructor con parametros a partir de un item * @param item Item El item para formar la regla * @param nClases int Numero de clases del problema */ public Regla(Item item, int nClases) { posiciones = item.getColumnas(); antecedente = item.getItem(); this.nClases = nClases; distrib = new int[nClases]; for (int i = 0; i < nClases; i++) { distrib[i] = 0; } this.clase = antecedente[antecedente.length - 1]; support = item.getSupport(); } /** * Copia una regla * @return r Regla ya copiada */ public Regla copiaRegla() { Regla r = new Regla(antecedente.length, this.nClases); for (int i = 0; i < antecedente.length; i++) { r.addAtributo(i, antecedente[i]); r.addPosicion(i, posiciones[i]); } r.setClase(clase); r.setSupport(this.support); r.setHeuristicaWRAcc(heuristica); r.setDistrib(this.getDistribucion()); r.nClases = this.nClases; r.adjuntaNombreAtributos(nombreAtributos); return r; } /** * A�ade un atributo a la regla * @param i int Posicion dentro del antecedente * @param a int El valor del atributo */ public void addAtributo(int i, int a) { antecedente[i] = a; } /** * A�ade un atributo a la regla * @param i int Posicion dentro del array * @param pos int Posicion del atributo */ public void addPosicion(int i, int pos) { posiciones[i] = pos; } /** * Devuelve el atributo i-esimo * @param i int Posicion dentro de la regla * @return double El atributo devuelto del antecedente */ public int getAtributo(int i) { return antecedente[i]; } /** * Devuelve el tama�o de la regla (n� atributos en el antecedente) * @return int El tama�o de la regla */ public int size() { return (antecedente.length - 1); } /** * @return la clase */ public int getClase() { return clase; } /** * @param i valor para la clase */ public void setClase(int i) { clase = i; } /** * Inserta el valor de support para esta regla * @param s int El valor */ public void setSupport(int s) { support = s; } /** * Devuelve el valor de support para esta regla * @return int El valor C */ public int getSupport() { return support; } public boolean cubre(Muestra m) { boolean resp = true; int i; double instancia[] = m.getMuest(); for (i = 0; i < this.size() && resp; i++) { // recorremos los valores del antecedente if (instancia[posiciones[i]] != antecedente[i]) { //El valor de la instancia para ese atributo no coincide resp = false; //La regla no cubre al ejemplo! } } return resp; } /** * Imprime la regla */ public void print() { for (int x = 0; x < this.size(); x++) { System.out.print("("+nombreAtributos[posiciones[x]] + " = "); System.out.print(" " + antecedente[x] + ")"); if (x < this.size() - 1) { System.out.print(" AND "); } } } /** * Imprime la regla * @return String La regla escrita como conocemos */ public String printString() { String cad = ""; for (int x = 0; x < this.size(); x++) { cad += nombreAtributos[posiciones[x]] + " = "; cad += antecedente[x] + " "; if (x < this.size() - 1) { cad += " AND "; } } return cad; } /** * Imprime el support de la regla * @return String Una cadena indicando el support */ public String printSupport(){ String cad = new String("-- Support: " + support); return cad; } /** * Realiza un reajuste de los valores de los atributos de la regla * @param cambio int[] Los nuevos valores (0 -> X, 1 -> Y...) */ public void ajusta(int[] cambio) { for (int i = 0; i < antecedente.length; i++) { antecedente[i] = cambio[antecedente[i]]; } clase = cambio[clase]; } /** * Realizamos una copia local del nombre de las variables de entrada * @param atributos String[] un Array que guarda el nombre de cada variable */ public void adjuntaNombreAtributos(String [] atributos){ nombreAtributos = new String[atributos.length]; for (int i = 0; i < atributos.length; i++){ nombreAtributos[i] = atributos[i]; } } /** * Ajusta el valor de la heur�stica WRAcc a un nuevo valor * @param heu double El nuevo valor de la heur�stica para la regla */ public void setHeuristicaWRAcc(double heu) { heuristica = heu; } /** * Devuelve el valor heur�stico WRAcc de la regla * @return double el valor heuristico */ public double getHeuristica() { return heuristica; } /** * Inserta una distribucion dada * @param distribucion int[] los valores de la distribucion */ public void setDistrib(int [] distribucion){ for (int i = 0; i < distribucion.length; i++){ this.distrib[i] = distribucion[i]; } } /** * Devuelve el valor de la distribucion de la regla dada * @return int[] El n� de ejemplos de train que cubre la regla para cada clase */ public int[] getDistribucion() { int ret[] = new int[nClases]; for (int i = 0; i < nClases; i++) { ret[i] = distrib[i]; } return ret; } /** * Devuelve la distribucion para una clase concreta * @param i int El identificador de la clase * @return int El n� de ejemplos cubiertos por la regla */ public int getDistribucionClase(int i) { return distrib[i]; } /** * Aunmenta en 1 los ejemplos cubiertos para la clase i * @param i int Indice de clase */ public void incremDistribClase(int i) { distrib[i] ++; } /** * Imprime la distribuci�n de la regla */ public void printDistribucion() { System.out.print(" ["); for (int i = 0; i < nClases; i++) { System.out.print(" "+distrib[i]); } System.out.print("]"); } /** * Guarda la distribuci�n como un String * @return String La distribucion ("visual") */ public String printDistribucionString() { String cad; cad = " ["; for (int i = 0; i < nClases; i++) { cad += " "+distrib[i]; } cad += "]"; return cad; } }