/* * copyright: Anthony Bagnall * */ package weka.filters.timeseries; import weka.core.Capabilities; import weka.core.Instances; import weka.core.Instance; import weka.core.Capabilities.Capability; import weka.core.matrix.*; import weka.filters.*; import java.util.*; import weka.core.DenseInstance; public class RankOrder extends SimpleBatchFilter { public double[][] ranks; public int numAtts=0; private boolean normalise=true; public void setNormalise(boolean f){normalise=f;}; public Instances process(Instances inst) throws Exception { //Set input instance format Instances result = new Instances(determineOutputFormat(inst), 0); rankOrder(inst); //Stuff into new set of instances for(int i=0;i<inst.numInstances();i++) { //Create a deep copy, think this is necessary to maintain meta data? Instance in=new DenseInstance(inst.instance(i)); //Reset to the ranks for(int j=0;j<numAtts;j++) in.setValue(j, ranks[i][j]); result.add(in); } if(normalise){ NormalizeAttribute na=new NormalizeAttribute(result); result=na.process(result); } return result; } protected class Pair implements Comparable{ int pos; double val; public Pair(int p, double d){ pos=p; val=d; } public int compareTo(Object c){ if(val>((Pair)c).val) return 1; if(val<((Pair)c).val) return -1; return 0; } } public void rankOrder(Instances inst){ numAtts=inst.numAttributes(); int c= inst.classIndex(); if(c>0) numAtts--; //If a classification problem it is assumed the class attribute is the last one in the instances Pair[][] d =new Pair[numAtts][inst.numInstances()]; for(int j=0;j<inst.numInstances();j++){ Instance x=inst.instance(j); for(int i=0;i<numAtts;i++) d[i][j]=new Pair(j,x.value(i)); } //Form rank order data set (in transpose of sorted array) //Sort each array of Pair for(int i=0;i<numAtts;i++) Arrays.sort(d[i]); ranks=new double[inst.numInstances()][numAtts]; for(int j=0;j<inst.numInstances();j++) for(int i=0;i<numAtts;i++) ranks[d[i][j].pos][i]=j; } public static void testFilter(Instances data, Filter ct){ try{ data.deleteStringAttributes(); ct.setInputFormat(data); Instances newData=Filter.useFilter(data,ct); System.out.print(newData); }catch(Exception e){ System.err.println("Exception thrown ="+e); System.err.println("Stack ="); StackTraceElement[] str=e.getStackTrace(); for(StackTraceElement s:str) System.err.println(s); } } @Override protected Instances determineOutputFormat(Instances inputFormat){ Instances result = new Instances(inputFormat, 0); return result; } @Override public String globalInfo() { return null; } public Capabilities getCapabilities() { Capabilities result = super.getCapabilities(); result.enableAllAttributes(); result.enableAllClasses(); result.enable(Capability.NO_CLASS); // filter doesn't need class to be set return result; } public String getRevision() { // TODO Auto-generated method stub return null; } public static void main(String[] args){ } }