/***********************************************************************
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.BioHEL;
import java.util.Arrays;
import java.util.Vector;
import keel.Dataset.Attributes;
import keel.Dataset.Instance;
public class classifier_aggregated {
Vector<classifier> classifiers;
double accuracy;
public classifier_aggregated() {
classifiers = new Vector<classifier>();
switch(Parameters.defaultClassOption) {
case Parameters.MAJOR:
Parameters.defaultClassInteger = getMostFrequentClass();
break;
case Parameters.MINOR:
Parameters.defaultClassInteger = getLeastFrequentClass();
break;
case Parameters.DISABLED:
default:
Parameters.defaultClassInteger = -1;
break;
}
}
public int getClase(int cla) {
if(Parameters.defaultClassInteger!=-1 && cla==classifiers.size())
return Parameters.defaultClassInteger;
return classifiers.get(cla).getClase();
}
public int getNumClassifiers() {
int numCL=classifiers.size();
if(Parameters.defaultClassInteger!=-1) numCL++;
return numCL;
}
public void setDefaultRule(instanceSet is) {
int i;
if(Parameters.defaultClassOption!=Parameters.DISABLED) return;
int nc=Parameters.numClasses;
int[] classCounts = new int[nc];
for(i=0;i<nc;i++) classCounts[i]=0;
int numInst=Parameters.is.getNumInstances();
Instance[] instances=Parameters.is.getAllInstances();
for(i=0;i<numInst;i++) {
classCounts[instances[i].getOutputNominalValuesInt(0)]++;
}
int max=classCounts[0];
int posMax=0;
for(i=1;i<nc;i++) {
if(classCounts[i]>max) {
posMax=i;
max=classCounts[i];
}
}
Parameters.defaultClassInteger=posMax;
}
public int classify(Instance ins) {
int i;
int size=classifiers.size();
for(i=0;i<size;i++) {
if(classifiers.get(i).doMatch(ins)) return i;
}
if(Parameters.defaultClassInteger!=-1) return size;
return -1;
}
public double getAccuracy() {return accuracy;}
public void setAccuracy(double acc) {accuracy=acc;}
public String dumpPhenotype() {
int i;
String temp = "";
int size=classifiers.size();
String string = "";
for(i=0;i<size;i++) {
temp = i +":";
string += temp;
temp = classifiers.get(i).dumpPhenotype();
string += temp;
}
if(Parameters.defaultClassInteger!=-1) {
temp = i +":Default rule -> " + Attributes.getOutputAttribute(0).getNominalValue(Parameters.defaultClassInteger) +"\n";
string += temp;
}
string += "\n";
return string;
}
public void addClassifier(classifier cl) {
classifiers.addElement(cl);
}
public int getMostFrequentClass(){
int[] countClass = new int[Parameters.numClasses];
Arrays.fill(countClass, 0);
for(int i = 0 ; i < Parameters.NumInstances ; ++i)
countClass[Parameters.instances[i].getOutputNominalValuesInt(0)]++;
int pos = 0;
int max = countClass[0];
for(int i = 1 ; i < Parameters.numClasses ; ++i)
if(countClass[i] > max)
pos = i;
return pos;
}
public int getLeastFrequentClass(){
int[] countClass = new int[Parameters.numClasses];
Arrays.fill(countClass, 0);
for(int i = 0 ; i < Parameters.NumInstances ; ++i)
countClass[Parameters.instances[i].getOutputNominalValuesInt(0)]++;
int pos = 0;
int min = countClass[0];
for(int i = 1 ; i < Parameters.numClasses ; ++i)
if(countClass[i] < min)
pos = i;
return pos;
}
}