/***********************************************************************
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.MIL.APR;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import keel.Algorithms.MIL.AbstractMIAlgorithm;
import net.sourceforge.jclec.util.dataset.IDataset;
import net.sourceforge.jclec.util.dataset.KeelDataSet;
import net.sourceforge.jclec.util.dataset.IDataset.IInstance;
public abstract class AbstractAPR extends AbstractMIAlgorithm
{
/////////////////////////////////////////////////////////////////
// --------------------------------------------------- Properties
/////////////////////////////////////////////////////////////////
protected ArrayList<Integer> bestFeatures = new ArrayList<Integer>();
/////////////////////////////////////////////////////////////////
// ------------------------------------------- Protected Methods
/////////////////////////////////////////////////////////////////
protected void greedyFeatureSelection(double[][] rectangle, int Class)
{
int maxCount = 0, bestFeature = 0;
do
{
int[] features = discriminatingFeatures(rectangle,Class);
maxCount = 0;
for(int i = 0; i < numberFeatures; i++)
if(features[i] > maxCount)
{
maxCount = features[i];
bestFeature = i;
}
if(maxCount > 0)
{
removeInstances(rectangle,Class,bestFeature);
bestFeatures.add(bestFeature);
}
}while(maxCount > 0);
}
protected int[] discriminatingFeatures(double[][] rectangle, int Class)
{
int[] features = new int[numberFeatures];
for(int i = 0; i < numberFeatures; i++)
if(!bestFeatures.contains(i))
for(int j = 0; j < trainInstances.size(); j++)
for(int k = 0; k < trainInstances.get(j).size(); k++)
if(trainInstances.get(j).get(k).getValue(classIndex) == Class)
if(trainInstances.get(j).get(k).getValue(i+1) < rectangle[i][0] || trainInstances.get(j).get(k).getValue(i+1) > rectangle[i][1])
features[i]++;
return features;
}
protected void removeInstances(double[][] rectangle, int Class, int feature)
{
ArrayList<int[]> toRemove = new ArrayList<int[]>();
for(int j = 0; j < trainInstances.size(); j++)
for(int k = trainInstances.get(j).size()-1; k >= 0; k--)
if(trainInstances.get(j).get(k).getValue(classIndex) == Class)
if(trainInstances.get(j).get(k).getValue(feature+1) < rectangle[feature][0] || trainInstances.get(j).get(k).getValue(feature+1) > rectangle[feature][1])
toRemove.add(new int[]{j,k});
for(int i = 0; i < toRemove.size(); i++)
trainInstances.get(toRemove.get(i)[0]).remove(toRemove.get(i)[1]);
}
protected boolean contains(double[][] rectangle, IInstance instance)
{
for(int i = 0; i < numberFeatures; i++)
if(instance.getValue(i+1) < rectangle[i][0] || instance.getValue(i+1) > rectangle[i][1])
return false;
return true;
}
protected boolean contains(double[][] rectangle, IInstance instance, ArrayList<Integer> features)
{
for(int i = 0; i < features.size(); i++)
if(instance.getValue(features.get(i)+1) < rectangle[features.get(i)][0] || instance.getValue(features.get(i)+1) > rectangle[features.get(i)][1])
return false;
return true;
}
protected double min(int attribute, int Class)
{
double min = Double.MAX_VALUE;
for(int i = 0; i < trainInstances.size(); i++)
for(int j = 0; j < trainInstances.get(i).size(); j++)
{
if(trainInstances.get(i).get(j).getValue(classIndex) == Class && trainInstances.get(i).get(j).getValue(attribute+1) < min)
min = trainInstances.get(i).get(j).getValue(attribute+1);
}
return min;
}
protected double max(int attribute, int Class)
{
double max = -Double.MAX_VALUE;
for(int i = 0; i < trainInstances.size(); i++)
for(int j = 0; j < trainInstances.get(i).size(); j++)
{
if(trainInstances.get(i).get(j).getValue(classIndex) == Class && trainInstances.get(i).get(j).getValue(attribute+1) > max)
max = trainInstances.get(i).get(j).getValue(attribute+1);
}
return max;
}
protected void report(String reportFileName, IDataset dataset, ArrayList<ArrayList<IInstance>> instances, double[][] rectangle, int Class)
{
int predictedClass;
String newline = System.getProperty("line.separator");
try {
BufferedReader reader= new BufferedReader(new FileReader(((KeelDataSet) dataset).getFileName()));
BufferedWriter writer= new BufferedWriter(new FileWriter(reportFileName));
String line= reader.readLine();
while(line.compareTo("@data") != 0)
{
writer.write(line + newline);
line = reader.readLine();
}
writer.write(line + newline);
reader.close();
for(int i = 0; i < instances.size(); i++)
{
predictedClass = 0;
if(Class == 0) predictedClass = 1;
for(int j = 0; j < instances.get(i).size(); j++)
{
if(contains(rectangle, instances.get(i).get(j)))
{
predictedClass = Class;
break;
}
}
writer.write((int)instances.get(i).get(0).getValue(classIndex) + " " + predictedClass + newline);
}
writer.close();
} catch (Exception e) {e.printStackTrace();}
}
protected void report(String reportFileName, IDataset dataset, ArrayList<ArrayList<IInstance>> instances, double[][] rectangle, int Class, ArrayList<Integer> features)
{
int predictedClass;
String newline = System.getProperty("line.separator");
try {
BufferedReader reader= new BufferedReader(new FileReader(((KeelDataSet) dataset).getFileName()));
BufferedWriter writer= new BufferedWriter(new FileWriter(reportFileName));
String line= reader.readLine();
while(line.compareTo("@data") != 0)
{
writer.write(line + newline);
line = reader.readLine();
}
writer.write(line + newline);
reader.close();
for(int i = 0; i < instances.size(); i++)
{
predictedClass = 0;
if(Class == 0) predictedClass = 1;
for(int j = 0; j < instances.get(i).size(); j++)
{
if(contains(rectangle, instances.get(i).get(j), features))
{
predictedClass = Class;
break;
}
}
writer.write((int)instances.get(i).get(0).getValue(classIndex) + " " + predictedClass + newline);
}
writer.close();
} catch (Exception e) {e.printStackTrace();}
}
}