/* * copyright: Anthony Bagnall * * */ package weka.filters.timeseries; import development.TimeSeriesClassification; import fileIO.OutFile; import java.io.FileReader; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import other_peoples_algorithms.Gorecki14nonisometric; import utilities.ClassifierTools; import weka.classifiers.lazy.DTW_kNN; import weka.classifiers.lazy.kNN; import weka.core.*; import weka.filters.SimpleBatchFilter; public class Cosine extends SimpleBatchFilter { @Override protected Instances determineOutputFormat(Instances inputFormat) throws Exception { Attribute a; FastVector fv=new FastVector(); FastVector atts=new FastVector(); for(int i=0;i<inputFormat.numAttributes()-1;i++) { //Add to attribute list String name = "Cosine_"+i; atts.addElement(new Attribute(name)); } //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("COSINE"+inputFormat.relationName(),atts,inputFormat.numInstances()); if(inputFormat.classIndex()>=0){ result.setClassIndex(result.numAttributes()-1); } return result; } @Override public String globalInfo() { return null; } @Override public Instances process(Instances instances) throws Exception { //for k=1 to n: f_k = sum_{i=1}^n f_i cos[(k-1)*(\pi/n)*(i-1/2)] //Assumes the class attribute is in the last one for simplicity Instances result = determineOutputFormat(instances); Instance newInst,oldInst; int n=instances.numAttributes()-1; for(int j=0;j<instances.numInstances();j++) { oldInst=instances.instance(j); newInst= new DenseInstance(result.numAttributes()); for(int k=0;k<n;k++){ double fk=0; for(int i=0;i<n;i++){ double c=k*(i+0.5)*(Math.PI/n); fk+=oldInst.value(i)*Math.cos(c); } newInst.setValue(k, fk); } newInst.setValue(result.classIndex(), instances.instance(j).classValue()); result.add(newInst); } return result; } public String getRevision() { return null; } public static void main(String[] args){ String s="Beef"; OutFile of1 = new OutFile("C:\\Users\\ajb\\Dropbox\\test\\BeefCosine_TRAIN.arff"); OutFile of2 = new OutFile("C:\\Users\\ajb\\Dropbox\\test\\BeefCosine_TEST.arff"); Instances test=utilities.ClassifierTools.loadData(TimeSeriesClassification.path+s+"\\"+s+"_TEST"); Instances train=utilities.ClassifierTools.loadData(TimeSeriesClassification.path+s+"\\"+s+"_TRAIN"); Cosine cosTransform= new Cosine(); Sine sinTransform=new Sine(); Hilbert hilbertTransform= new Hilbert(); System.out.println(" Data set ="+s); try { Instances cosTrain=cosTransform.process(train); Instances cosTest=cosTransform.process(test); of1.writeString(cosTrain+""); of2.writeString(cosTest+""); System.out.println(" Cosine trans complete"); kNN a=new DTW_kNN(1); a.normalise(false); a.buildClassifier(cosTrain); double acc=ClassifierTools.accuracy(cosTest, a); System.out.println(" Cosine acc ="+acc); } catch (Exception ex) { Logger.getLogger(Gorecki14nonisometric.class.getName()).log(Level.SEVERE, null, ex); } } }