/*********************************************************************** 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.RE_SL_Methods.TSK_IRL; import java.lang.Math; class Adap { public double[] grado_pertenencia; public double EC, EL; public int n_ejemplos_positivos; public int[] indices_ep; public double[] cubrimiento; public double omega, K, epsilon; public double[] puntos; public double F, G, g, PC; public int EmparejaAnt; public int tipo_fitness; public MiDataset tabla; public BaseR base_reglas; public Adap(MiDataset training, BaseR base_r, double valor_omega, double valor_k, double valor_epsilon, int t_fitness) { int i; tabla = training; base_reglas = base_r; omega = valor_omega; K = valor_k; epsilon = valor_epsilon; tipo_fitness = t_fitness; indices_ep = new int[tabla.long_tabla]; cubrimiento = new double[tabla.long_tabla]; puntos = new double[tabla.n_var_estado]; grado_pertenencia = new double[tabla.n_var_estado]; } public static double Minimo(double x, double y) { if (x < y) { return (x); } else { return (y); } } public static double Maximo(double x, double y) { if (x > y) { return (x); } else { return (y); } } /* ------------------------------------------------------------------------- FUNCION FITNESS ------------------------------------------------------------------------- */ /* ------------------------- Criterios de reglas -------------------------- */ /* -------------------------- Medida Local de Error ----------------------- */ /* Calcula el grado de compatibilidad (Ri(ek)) de los antecedentes de la regla con el ejemplo */ double AntecedenteCubreEjemplo(double[] cromosoma, double[] ejem) { int i, pos_individuo; double min; Difuso D = new Difuso(); for (i = 0; i < tabla.n_var_estado; i++) { pos_individuo = tabla.n_var_estado + 3 * i; D.x0 = cromosoma[pos_individuo]; D.x1 = cromosoma[pos_individuo + 1]; D.x2 = cromosoma[pos_individuo + 1]; D.x3 = cromosoma[pos_individuo + 2]; D.y = 1; grado_pertenencia[i] = base_reglas.Fuzzifica(ejem[i], D); } min = 1; for (i = 0; i < tabla.n_var_estado; i++) { if (grado_pertenencia[i] < min) { min = grado_pertenencia[i]; } } return (min); } double Alfa_Error(double[] Consecuentes) { int i, j; double suma, salida; for (i = 0, suma = 0.0; i < n_ejemplos_positivos; i++) { /* Proceso de inferencia con una unica regla */ /* inicializo la salida al valor b. Aplico la tangente para obtener el valor real porque dicho valor esta codificado con el angular coding */ salida = Math.tan(Consecuentes[tabla.n_var_estado]); for (j = 0; j < tabla.n_var_estado; j++) { salida += Math.tan(Consecuentes[j]) * tabla.datos[indices_ep[i]].ejemplo[j]; } suma += tabla.datos[indices_ep[i]].nivel_cubrimiento * Math.pow(tabla.datos[indices_ep[i]].ejemplo[tabla.n_var_estado] - salida, 2.0); } return (suma); } /* Errores Cuadratico y Lineal */ public void Error_tra() { int i, j; double suma1, suma2, fuerza; for (j = 0, suma1 = suma2 = 0.0; j < tabla.long_tabla; j++) { fuerza = base_reglas.FLC_TSK(tabla.datos[j].ejemplo); suma1 += Math.pow(tabla.datos[j].ejemplo[tabla.n_var_estado] - fuerza, 2.0); suma2 += Math.abs(tabla.datos[j].ejemplo[tabla.n_var_estado] - fuerza); } EC = suma1 / (double) tabla.long_tabla; EL = suma2 / (double) tabla.long_tabla; } /* Errores Cuadratico y Lineal */ public void Error_tst(MiDataset tabla_tst) { int i, j; double suma1, suma2, fuerza; for (j = 0, suma1 = suma2 = 0.0; j < tabla_tst.long_tabla; j++) { fuerza = base_reglas.FLC_TSK(tabla_tst.datos[j].ejemplo); suma1 += Math.pow(tabla_tst.datos[j].ejemplo[tabla.n_var_estado] - fuerza, 2.0); suma2 += Math.abs(tabla_tst.datos[j].ejemplo[tabla.n_var_estado] - fuerza); } EC = suma1 / (double) tabla_tst.long_tabla; EL = suma2 / (double) tabla_tst.long_tabla; } /* ---------------------------- Funcion fitness --------------------------- */ /* Guardo en tabla.datos[j].nivel_cubrimiento el matching con los antecedentes de la regla. Si el ejemplo es positivo, es decir, su matching es mayor que 0, guardo su posicion en la estructura indices_ep*/ public void ejemplos_positivos(double[] ant) { int i; n_ejemplos_positivos = 0; for (i = 0; i < tabla.long_tabla; i++) { tabla.datos[i].nivel_cubrimiento = AntecedenteCubreEjemplo(ant, tabla.datos[i].ejemplo); if (tabla.datos[i].nivel_cubrimiento > 0.0) { indices_ep[n_ejemplos_positivos] = i; n_ejemplos_positivos++; } } } public void cubrimiento(double[] ant) { int i; double RCE; for (i = 0; i < tabla.long_tabla; i++) { RCE = AntecedenteCubreEjemplo(ant, tabla.datos[i].ejemplo); cubrimiento[i] += RCE; tabla.datos[i].maximo_cubrimiento = Maximo(tabla.datos[i]. maximo_cubrimiento, RCE); if ( (cubrimiento[i] >= epsilon) && (tabla.datos[i].cubierto == 0)) { tabla.datos[i].cubierto = 1; tabla.no_cubiertos--; } } } /* ---------------------------- Funcion fitness --------------------------- */ double eval_ml(double[] cromosoma) { return (Alfa_Error(cromosoma)); } /* ------------------------------------------------------------------------- Funciones comunes ------------------------------------------------------------------------- */ /* salida */ public String getSalidaObli(MiDataset tabla_datos) { int j; double fuerza; String salida; salida = "@data\n"; for (j = 0; j < tabla_datos.long_tabla; j++) { fuerza = base_reglas.FLC_TSK(tabla_datos.datos[j].ejemplo); salida += (tabla_datos.datos[j]).ejemplo[tabla_datos.n_var_estado] + " " + fuerza + " " + "\n"; } salida = salida.substring(0, salida.length() - 1); return (salida); } }