package transformations; import weka.core.*; import distributions.*; // Null lass does not change anything abstract public class Transformations { //Transform data dependent on the boolean supervised=false; boolean response=false; public boolean isSupervised(){return supervised;} public boolean isResponseTransform(){return response;} abstract public Instances transform(Instances data); abstract public Instances invert(Instances data); //Transform data based on values formed by calling transform on another data set //Only needed for dependent variable transformations, for others does nothing abstract public Instances staticTransform(Instances data); abstract public double[] invertPredictedResponse(double[] d); public double[] invertPredictedQuantiles(double[] d) { return invertPredictedResponse(d); } public static int width=100; static public void setWidth(int w){width=w;} static public double[] getNormalQuantiles(double mean,double variance) { double[] q= new double[width]; NormalDistribution norm = new NormalDistribution(mean,Math.sqrt(variance)); for(int i=0;i<width;i++) q[i]=norm.getQuantile((i+1)/(double)width); return q; } static public double[] getNormalQuantiles(double[] standard, double mean,double variance) { double stDev=Math.sqrt(variance); double[] q= new double[standard.length]; for(int i=0;i<standard.length;i++) q[i]=standard[i]*stDev+mean; return q; } public double[] findResiduals(double[] actual, double[] fitted) { if(actual.length!=fitted.length) { System.out.println(" Error, mismatched lengths in findResiduals"); System.exit(0); } double[] res= new double[actual.length]; for(int i=0;i<res.length;i++) res[i]=actual[i]-fitted[i]; return res; } static public Instances powerTransform(Instances data, int[] pos, double[] powers) { Instance inst; int p=data.classIndex(); for(int i=0;i<data.numInstances();i++) { inst=data.instance(i); for(int j=0;j<pos.length;j++) { if(pos[j]!=p) { if(powers[j]!=0) inst.setValue(pos[j], Math.pow(inst.value(j),powers[j])); else inst.setValue(pos[j], Math.log(inst.value(j))); } } } return data; } }