/***********************************************************************
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.Genetic_Rule_Learning.PSO_ACO;
import java.util.*;
/**
* <p>T�tulo: Hibridaci�n Pso Aco</p>
* <p>Descripci�n: Hibridacion entre los dos algoritmos Pso y Aco</p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Empresa: </p>
* @author Vicente Rub�n del Pino
* @version 1.0
*/
public class ConjuntoDatos {
private Vector muestras; //Vector con las muestras sacadas del fichero
/**
* Constructor por defecto
* Crea un conjunto vacio.
*/
public ConjuntoDatos() {
muestras = new Vector();
}
/**
* Constructor a partir de un vector de muestras
* @param datos Vector Vector con las muestras a incluir en el conjunto de datos
*/
public ConjuntoDatos(Vector datos) {
muestras = new Vector(datos);
}
/**
* Modulo que inserta una muestra en el conjunto de datos
* @param ejemplo Muestra
*/
public void insertaMuestra(Muestra ejemplo) {
//addElement A�ade un elemento al final del vector (perfecto)
muestras.addElement(ejemplo);
}
/**
* Modulo que elimina una muestra del conjunto de datos
* @param indice int Indice de la muestra a eliminar
*/
public void eliminaMuestra(int indice) {
muestras.removeElementAt(indice);
}
/**
* Funcion que elimina una muestra del conjunto de datos
* @param muestra Muestra Muestra a eliminar del conjunto de datos
* @return boolean Booleano que indica si ha sido eliminado o por el contrario no
*/
public boolean eliminaMuestra(Muestra muestra) {
boolean devolver;
devolver = muestras.remove(muestra);
return devolver;
}
/**
* Funcion que devuelve la primera muestra del conjunto de datos
* @return Muestra
*/
public Muestra obtenerMuestra() {
Muestra devolver;
devolver = (Muestra) muestras.firstElement();
return devolver;
}
/**
* Funcion que devuelve la muestra del conjunto de datos en la posicion indice
* @param indice int Indice de la muestra a obtener
* @return Muestra
*/
public Muestra obtenerMuestra(int indice) {
Muestra devolver;
devolver = (Muestra) muestras.get(indice);
return devolver;
}
/**
* Modulo que imprime el conjunto de datos entero por pantalla
* @param nombre String Nombre del conjunto de datos
*/
public void imprimir(String nombre) {
Muestra actual;
System.out.println("Conjunto de muestras " + nombre);
for (int i = 0; i < muestras.size(); i++) {
actual = (Muestra) muestras.get(i);
actual.imprimir();
}
}
/**
* Funcion que devuelve el numero de muestras que posee el conjunto de datos
* @return int Numero de muestras que contiene el conjunto
*/
public int tamanio() {
int devolver;
devolver = muestras.size();
return devolver;
}
/**
* Funcion que devuelve un vector de probabilidades de que haya en las muestras Aij y cada W
* @param atributo Atributo Atributo junto con su valor
* @param clases Vector Lista con las distintas clases que hay
* @return float [] Vector con las probabilidades.
*/
public float[] listaProbabilidadesAtributoClase(Atributo atributo,
Vector clases) {
int numClases = clases.size();
float[] devolver = new float[numClases];
Muestra actual;
int total = 0;
boolean terminado = false;
Atributo clase;
for (int i = 0; i < numClases; i++) {
devolver[i] = 0;
}
for (int i = 0; i < muestras.size(); i++) {
actual = (Muestra) muestras.get(i);
if (actual.estaAtributo(atributo)) { //Esta el atributo
total++;
terminado = false;
for (int j = 0; j < numClases && !terminado; j++) {
clase = (Atributo) clases.get(j);
if (actual.estaClase(clase)) {
devolver[j]++;
terminado = true;
}
}
}
}
for (int i = 0; i < numClases; i++) {
if (devolver[i] != 0) {
devolver[i] = devolver[i] / total;
}
}
return devolver;
}
/**
* Modulo que elimina las muestras cubiertas por la regla que se pasa por parametro
* @param regla Regla Regla que debe cubrir las muestras a eliminar
*/
public void eliminaMuestrasCubiertas(Regla regla) {
Vector lista = new Vector();
Muestra mt;
for (int i = 0; i < muestras.size(); i++) {
mt = (Muestra) muestras.get(i);
if (regla.estanCondicionesEn(mt)) {
lista.addElement(mt);
}
}
muestras.removeAll(lista);
}
/**
* Modulo que elimina las muestras que tienen la clase que se pasa por parametro
* @param regla Regla para comprobar los elementos a eliminar
*/
public void eliminaMuestrasClase(Regla regla) {
Vector lista = new Vector();
Muestra mt;
Atributo clase = regla.obtenerReglaPredicha();
for (int i = 0; i < muestras.size(); i++) {
mt = (Muestra) muestras.get(i);
if (mt.estaClase(clase)) {
lista.addElement(mt);
}
}
muestras.removeAll(lista);
}
/**
* Funcion que calcula el porcentaje de muestras cubiertas por la regla que se
* le pasa por parametro.
* @param regla Regla Regla a comprobar su numero de muestras cubiertas.
* @param cVacias Condiciones Vacias
* @return float Porcentaje de muestras cubiertas.
*/
public float porcentajeMuestrasCubiertas(Regla regla, Vector cVacias) {
float porcentaje = 0;
float total = muestras.size();
float cubiertas = 0;
Muestra mt;
Vector eliminar = new Vector();
for (int i = 0; i < muestras.size(); i++) {
mt = (Muestra) muestras.get(i);
if (regla.cubreMuestraTotal(mt)) {
cubiertas++;
eliminar.addElement(mt);
}
}
muestras.removeAll(eliminar);
porcentaje = cubiertas;
return porcentaje;
}
/**
* Funcion que devuelve un Vector con las muestras que contiene el conjunto
* de datos.
* @return Vector Muestras que contiene el conjunto de datos.
*/
public Vector obtenerMuestras() {
Vector devolver = new Vector(muestras);
return devolver;
}
/**
* Funcion que devuelve la clase que aparece mas veces en el conjunto de datos
* @param listaClases Vector Lista con las distintas clases que pueden aparecer
* @return int Numero de la clase que aparece mas veces en el conjunto de datos
*/
public int obtenerMayorClase(Vector listaClases) {
int[] ocurrencias = new int[listaClases.size()];
Muestra mt;
Atributo clase;
Atributo original;
int mejor = 0;
int posMejor = 0;
for (int i = 0; i < listaClases.size(); i++) {
ocurrencias[i] = 0;
}
for (int i = 0; i < muestras.size(); i++) {
mt = (Muestra) muestras.get(i);
clase = mt.getClase();
for (int j = 0; j < listaClases.size(); j++) {
original = (Atributo) listaClases.get(j);
if (clase.esIgual(original)) {
ocurrencias[j]++;
}
}
}
for (int i = 0; i < listaClases.size(); i++) {
if (ocurrencias[i] >= mejor) {
mejor = ocurrencias[i];
posMejor = i;
}
}
return posMejor;
}
/**
* Funcion que calcula el procentaje de muestras con la condicion que se pasa
* @param condicion Condicion que deben tener las muestras
* @param clase Clase que deben tener las muestras
* @return Porcentaje de muestras que cumplen la condicion
*/
public float porcentajeMuestrasCondicion(Condicion condicion,
Atributo clase) {
Muestra mt;
Atributo comprobar;
Atributo at;
int indice;
float tamanio = 0;
float aciertos = 0;
float porcentaje;
double valorOriginal;
double valorCondicion;
at = condicion.getValor();
indice = at.getAtributo();
for (int i = 0; i < muestras.size(); i++) {
mt = (Muestra) muestras.get(i);
comprobar = mt.getValor(indice); //en muestra tb puede estar vacio!!!!!
if (at.getValor() == -1 || comprobar.getValor() == -1) {
tamanio++;
} else {
switch (condicion.getOperador()) {
case 0: //=
if (comprobar.esIgual(at)) {
tamanio++;
if (mt.getClase().esIgual(clase)) {
aciertos++;
}
}
break;
case 1: //<
valorOriginal = comprobar.getValor();
valorCondicion = at.getValor();
if (valorOriginal <= valorCondicion) {
tamanio++;
if (mt.getClase().esIgual(clase)) {
aciertos++;
}
}
break;
case 2: //>
valorOriginal = comprobar.getValor();
valorCondicion = at.getValor();
if (valorOriginal >= valorCondicion) {
tamanio++;
if (mt.getClase().esIgual(clase)) {
aciertos++;
}
}
break;
}
}
}
if (aciertos == 0) {
porcentaje = 0;
} else {
porcentaje = aciertos / tamanio;
}
return porcentaje;
}
/**
* Funcion que calcula el porcentaje de muestras que tienen el atributo vacio
* @param vacio Atributo vacio
* @param clase Clase que deben tener
* @return Porcentaje de muestras vacias
*/
public float porcentajeMuestrasVacias(Atributo vacio, Atributo clase) {
float porcentaje;
float aciertos = 0;
float tamanio = 0;
Muestra mt;
for (int i = 0; i < muestras.size(); i++) {
mt = (Muestra) muestras.get(i);
if (mt.estaAtributo(vacio) && mt.estaClase(clase)) {
aciertos++;
}
if (mt.estaAtributo(vacio)) {
tamanio++;
}
}
if (aciertos == 0 || tamanio == 0) {
porcentaje = 0;
} else {
porcentaje = aciertos / tamanio;
}
return porcentaje;
}
/**
* Funcion que calcula el porcentaje de muestras que tienen un clase
* @param clase Clase que deben tener las muestras
* @return Porcentaje calculado
*/
public float porcentajeMuestrasClase(Atributo clase) {
int tamanio = muestras.size();
Muestra mt;
float aciertos = 0;
for (int i = 0; i < tamanio; i++) {
mt = (Muestra) muestras.get(i);
if (mt.estaClase(clase)) {
aciertos++;
}
}
return aciertos / tamanio;
}
/**
* Funcion que devuelve un vector con el porcentaje de muestras para cada clase
* @param clases Lista de clases
* @return Vector con los porcentajes de muestras
*/
public int[] porcentajeMuestrasClase(Vector clases) {
int tamanio = muestras.size();
Atributo clase;
Muestra mt;
boolean parada = false;
int[] aciertos = new int[clases.size()];
for (int i = 0; i < clases.size(); i++) {
aciertos[i] = 0;
}
for (int i = 0; i < tamanio; i++) {
mt = (Muestra) muestras.get(i);
parada = false;
for (int j = 0; j < clases.size() && !parada; j++) {
clase = (Atributo) clases.get(j);
if (mt.estaClase(clase)) {
aciertos[j]++;
parada = true;
}
}
}
return aciertos;
}
/**
*Funcion que devuelve el numero de muestras que tienen las condiciones
* @param hormiga Regla con las condiciones que deben tener las muestras
* @param cVacias Lista de condiciones Vacias
* @return Numero de muestras que cumplen la condicion
*/
public int numeroMuestrasCondiciones(Regla hormiga, Vector cVacias) {
int devolver = 0;
Muestra actual;
for (int i = 0; i < muestras.size(); i++) {
actual = (Muestra) muestras.get(i);
if (hormiga.cubreMuestraTotal(actual)) {
devolver++;
}
}
return devolver;
}
/**
* Funcion que devuelve el numero de muestras cubiertas por una regla
* @param hormiga Regla que debe cubrir las muetras
* @param cVacias Lista de condiciones vacias
* @return Numero de muestras cubiertas
*/
public int numeroMuestrasCubiertas(Regla hormiga, Vector cVacias) {
int devolver = 0;
Muestra actual;
for (int i = 0; i < muestras.size(); i++) {
actual = (Muestra) muestras.get(i);
if (hormiga.cubreMuestraTotal(actual)) {
devolver++;
}
}
return devolver;
}
/**
* Funcion que devuelve el numero de muestras que cubre la regla
* @param hormiga Regla que debe cubrir las muestras
* @return Numero de muestras
*/
public int numeroMuestrasCubiertasSinClase(Regla hormiga) {
int devolver = 0;
Muestra actual;
for (int i = 0; i < muestras.size(); i++) {
actual = (Muestra) muestras.get(i);
if (hormiga.estanCondicionesEn(actual)) {
devolver++;
}
}
return devolver;
}
/**
* Funcion que indica si se cubre un minimo con una regla o no
* @param hormiga Regla que debe cubrir el minimo de muestras
* @param minimoCasosRegla Minimo de casos que se debe cubrir
* @return True en caso de que se cubran, False en caso contrario
*/
public boolean cubreMinimo(Regla hormiga, int minimoCasosRegla) {
Muestra actual;
int cubiertas = 0;
for (int i = 0; i < muestras.size(); i++) {
actual = (Muestra) muestras.get(i);
if (hormiga.cubreMuestraTotal(actual)) {
cubiertas++;
}
if (cubiertas >= minimoCasosRegla) {
return true;
}
}
return false;
}
}