package transformations; import weka.core.*; /* Implements a simple log transformation of the response variable * * */ public class Exponential extends Transformations{ double offSet=0; static double zeroOffset=1; public Exponential() { supervised=true; response=true; } public Instances transform(Instances data){ //Not ideal, should call a method to get this int responsePos=data.numAttributes()-1; System.out.println(" Response Pos = "+responsePos); double[] response=data.attributeToDoubleArray(responsePos); //Find the min value double min=response[0]; for(int i=0;i<response.length;i++) { if(response[i]<min) min=response[i]; } if(min<=zeroOffset) //Cant take a log of a negative, so offset { offSet=-min+zeroOffset; } else offSet=0; System.out.println(" Min value = "+min+" offset = "+offSet); for(int i=0;i<data.numInstances();i++) { Instance t = data.instance(i); double resp=t.value(responsePos); System.out.print(i+" "+resp); resp=Math.log(resp+offSet); System.out.println(" "+resp); t.setValue(responsePos,resp); } return data; } public Instances invert(Instances data){ int responsePos=data.numAttributes()-1; for(int i=0;i<data.numInstances();i++) { Instance t = data.instance(i); double resp=t.value(responsePos); resp=Math.exp(resp); resp-=offSet; t.setValue(responsePos,resp); } return data; } public double[] invertPredictedResponse(double[] d){ for(int i=0;i<d.length;i++) { d[i]=Math.exp(d[i]); d[i]-=offSet; } return d; } //Get quantile values for a transformed response, assuming //Mean and variance of model //Not relevant, only needed for st public Instances staticTransform(Instances data){ return data; } }