package weka.filters.timeseries; import weka.core.*; import weka.core.matrix.*; import weka.filters.*; import weka.core.matrix.Matrix; /* 6/3/13: THIS IS NOT WORKING CORRECTLY, DO NOT USE This filter transforms the data according to Jans idea. Not sure * * <xy>-<x><y> -------------- = r = correlation coefficient std(x)*std(y) */ public class Correlation extends SimpleBatchFilter { Matrix covariance; Matrix eigenvectors; Matrix X; int numAtts=0; private void findCovariance(Instances inst){ setOutputFormat(inst); //! Extract data set as a matrix X 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 double[][] d =new double[inst.numInstances()][numAtts]; for(int i=0;i<inst.numInstances();i++) { Instance x=inst.instance(i); for(int j=0;j<numAtts;j++) d[i][j]=x.value(j); } //Find means and subtract from X double mean; for(int j=0;j<numAtts;j++) { mean=0; for(int i=0;i<inst.numInstances();i++) mean+=d[i][j]; mean/=inst.numInstances(); for(int i=0;i<inst.numInstances();i++) d[i][j]-=mean; } X=new Matrix(d); //Work out X_T X covariance=X.transpose().times(X); covariance.timesEquals(1.0/((double)inst.numInstances()-1)); } public void findEigenVectors(){ //Pull out the Eigenvectors EigenvalueDecomposition ev = new EigenvalueDecomposition(covariance); eigenvectors=ev.getV(); } public Instances process(Instances inst) throws Exception { Instances result=determineOutputFormat(inst); findCovariance(inst); findEigenVectors(); Matrix y=eigenvectors.times(X); //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 new vals for(int j=0;j<numAtts;j++) in.setValue(j, y.get(i, j)); result.add(in); } return result; } public String getRevision() { // TODO Auto-generated method stub return null; } @Override protected Instances determineOutputFormat(Instances inputFormat) throws Exception { if(true) throw new Exception("Added: 6/3/13. FILTER CORRELTATION IS NOT CORRECTLY IMPLEMENTED, DO NOT USE"); int length=inputFormat.numAttributes(); if(inputFormat.classIndex()>=0) length--; //Check all attributes are real valued, otherwise throw exception for(int i=0;i<inputFormat.numAttributes();i++) if(inputFormat.classIndex()!=i) if(!inputFormat.attribute(i).isNumeric()) throw new Exception("Non numeric attribute not allowed in Correlation Filter"); //Set up instances size and format. FastVector atts=new FastVector(); String name; for(int i=0;i<length;i++){ name = "Correlation_"+i; atts.addElement(new Attribute(name)); } if(inputFormat.classIndex()>=0){ //Classification set, set class //Get the class values as a fast vector Attribute target =inputFormat.attribute(inputFormat.classIndex()); FastVector vals=new FastVector(target.numValues()); for(int i=0;i<target.numValues();i++) vals.addElement(target.value(i)); atts.addElement(new Attribute(inputFormat.attribute(inputFormat.classIndex()).name(),vals)); } Instances result = new Instances("Correlation"+inputFormat.relationName(),atts,inputFormat.numInstances()); if(inputFormat.classIndex()>=0){ result.setClassIndex(result.numAttributes()-1); } return result; } @Override public String globalInfo() { // TODO Auto-generated method stub return null; } public static void main(String[] args){ double[][] d = {{1,2,1},{6,-1,0},{-1,-2,-1}}; Matrix m=new Matrix(d); EigenvalueDecomposition ev = new EigenvalueDecomposition(m); Matrix eigenvectors=ev.getV(); double[] evals=ev.getRealEigenvalues(); for(double x:evals) System.out.println(x); System.out.println(eigenvectors); Matrix y=ev.getD(); System.out.println(y); System.exit(0); // Instances data =SRNACluster.loadData(SRNACluster.rootPath+"sRNA10_small"); // Filter ct=new Correlation(); // RankOrderTransform.testFilter(data,ct); } }