package keel.Algorithms.ImbalancedClassification.Resampling.SMOTE_RSB.Rough_Sets; import java.io.Serializable; public class RoughSetsOriginal implements Serializable { /** * */ // private static final long serialVersionUID = 7659983106378537022L; /** * */ public Instances m_Data; protected int[][] equivalence_sets; public int[][] lower_aproximation; public int[][] upper_aproximation; protected double[] precision; protected Instances[] instancesByClass; public int[][] boundary; public int m_sig; ApproximateSets distance = new ApproximateSets(); Arrays m_Arrays = new Arrays(); double CutOff; public int[][] get_upper_aproximation() { return upper_aproximation; } public int[][] get_lower_aproximation() { return lower_aproximation; } public int[][] get_equivalence_set() { return equivalence_sets; } public double get_precision(int index_class) { if (precision != null && index_class < m_Data.numClasses()) { return precision[index_class]; } else { return -1; } } public Instances[] get_instancesByClass(){ return instancesByClass; } public RoughSetsOriginal(Instances data, int sig, double cOff) { m_Data = data; CutOff = cOff; m_sig = sig; try { EquivalenceClasses(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } DivideInstancesByClass(); //lower_aproximation(); //upper_aproximation(); // boundary(); } public int[][] byClasses() { int[][] ins = new int[m_Data.numClasses()][]; for (int i = 0; i < ins.length; i++) { int count = 0; int[] inst_class = new int[m_Data.numInstances()]; for (int j = 0; j < m_Data.numInstances(); j++) { if (m_Data.instance(j).classValue() == i) { inst_class[count] = j; count++; } } int[] inst_class_end = new int[count]; for (int j = 0; j < count; j++) { inst_class_end[j] = inst_class[j]; } ins[i] = inst_class_end; } return ins; } public void DivideInstancesByClass() { instancesByClass = (new SInstances(m_Data)).byClasses(); } /** * Compute the equivalence classes * * @throws Exception */ public void EquivalenceClasses() throws Exception { equivalence_sets = new int[m_Data.numInstances()][]; for (int i = 0; i < m_Data.numInstances(); i++) { //System.out.println("Instancia "+i); equivalence_sets[i] = EquivClasses_Instance(m_Data.instance(i)); } } /** * Compute the equivalence classes to an instance. Return a list with the * index of the equivalence clasess of an instance * * @param obj * @return the list with the index of the equivalence classes * @throws Exception */ public int[] EquivClasses_Instance(Instance obj) throws Exception { int[] dist = new int[m_Data.numInstances()]; int i = 0; distance.setInstances(m_Data); // m_Arrays.setInstances(m_Data); for (int j = 0; j < m_Data.numInstances(); j++) { double distanceValue = distance.CompRasgos(obj, j); if (m_sig == 1) { if ( distanceValue >= CutOff) { dist[i++] = j; } } else { if (distanceValue <= CutOff) { dist[i++] = j; } } } int[] distend = new int[i]; for (int j = 0; j < i; j++) { distend[j] = dist[j]; } return distend; } /** * Compute the lower aproximations of the dataset * * */ public void lower_aproximation() { lower_aproximation = new int[m_Data.numClasses()][]; for (int i = 0; i < m_Data.numClasses(); i++) { lower_aproximation[i] = lower_aproximation_Set(i); } } /** * Compute the lower aproximation of a set * * @param class_index */ public int[] lower_aproximation_Set(int class_index) { int[] la = new int[m_Data.numInstances()]; int[] la_end = null; int count = 0; for (int j = 0; j < m_Data.numInstances(); j++) { int index = 0; while ((index < equivalence_sets[j].length) && (m_Data.instance(equivalence_sets[j][index]) .classValue() == class_index)) { index++; } if (index == equivalence_sets[j].length) { la[count++] = j; //System.out.println(j+" Instancia equivalente"); } } la_end = new int[count]; for (int k = 0; k < count; k++) { la_end[k] = la[k]; } return la_end; } /** * Compute the upper aproximation */ public void upper_aproximation() { upper_aproximation = new int[m_Data.numClasses()][]; for (int i = 0; i < m_Data.numClasses(); i++) { upper_aproximation[i] = upper_aproximation_Set(i); } } /** * Compute the upper aproximation of a set * * @param class_index */ public int[] upper_aproximation_Set(int class_index) { int[] ua = new int[m_Data.numInstances()]; int[] ua_end = null; int count = 0; for (int j = 0; j < m_Data.numInstances(); j++) { int index = 0; while ((index < equivalence_sets[j].length) && (m_Data.instance(equivalence_sets[j][index]) .classValue() != class_index)) { index++; } if (index < equivalence_sets[j].length) { ua[count++] = j; } } ua_end = new int[count]; for (int k = 0; k < count; k++) { ua_end[k] = ua[k]; } return ua_end; } /** * Compute the boundary of the set (Cases in the upper aproximation and not * in the lower aproximation) */ public int[] boundary_Class(int index_class) { int[] b = new int[upper_aproximation[index_class].length - lower_aproximation[index_class].length]; for (int i = 0; i < upper_aproximation[index_class].length; i++) { int j = 0; int count = 0; while (j < lower_aproximation[index_class].length && upper_aproximation[index_class][i] != lower_aproximation[index_class][j]) { j++; count++; } if (j >= lower_aproximation[index_class].length) { b[count] = upper_aproximation[index_class][i]; } } return b; } public void boundary() { boundary = new int[upper_aproximation.length][]; for (int i = 0; i < m_Data.numClasses(); i++) { boundary[i] = boundary_Class(i); } } /** * Convert from a lisf of index to a list of Instances from m_Data * * @param Set * @return list of Instances corresponded to the index in Set from m_Data */ public Instances convert_Set(int[] Set) { Instances inst = new Instances(m_Data, 0, 0); for (int i = 0; i < Set.length; i++) { // inst.add(m_Data.instance(i)); inst.add(m_Data.instance(Set[i])); } return inst; } }