/* WORMS */ package applications; import applications.HandandBoneOutlines; import fileIO.InFile; import fileIO.OutFile; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import utilities.ClassifierTools; import weka.classifiers.Classifier; import weka.core.Instances; import weka.core.shapelet.QualityMeasures; import weka.filters.NormalizeCase; import weka.filters.timeseries.SummaryStats; import weka.filters.timeseries.shapelet_transforms.*; /** * * @author ajb */ public class Worms { static int[] seriesLengths; static String[] classLabels={"N2","goa1", "unc1","unc38","unc63"}; static int nosSeries; static DecimalFormat df= new DecimalFormat("##.####"); static String path="C:\\Users\\ajb\\Dropbox\\Worms Project\\"; static int newLength=900; public static void formatArff(){ //Load into array InFile f= new InFile("C:\\Users\\ajb\\Dropbox\\Worms Project\\dataSeries.csv"); InFile f2= new InFile("C:\\Users\\ajb\\Dropbox\\Worms Project\\seriesLengths.csv"); nosSeries=f2.countLines(); double[][] series=new double[nosSeries][]; String[] labels=new String[nosSeries]; seriesLengths=new int[nosSeries]; System.out.println(" Number of series in new data set ="+nosSeries); f2= new InFile("C:\\Users\\ajb\\Dropbox\\Worms Project\\seriesLengths.csv"); for(int i=0;i<nosSeries;i++){ seriesLengths[i]=f2.readInt(); series[i]=new double[seriesLengths[i]]; for(int j=0;j<seriesLengths[i];j++){ series[i][j]=f.readDouble(); } labels[i]=f.readString(); } System.out.println(" Finished Loading"); //Downsample to length 900 by averaging over the second double[][] newSeries=new double[nosSeries][newLength]; for(int i=0;i<nosSeries;i++){ int count =0; int period=newSeries[i].length/newLength; for(int j=0;j<newSeries[i].length;j++){ newSeries[i][j]=series[i][count++]; for(int k=1;k<period;k++) newSeries[i][j]+=series[i][count++]; newSeries[i][j]/=period; } } //Write to Arff = OutFile out = new OutFile("C:\\Users\\ajb\\Dropbox\\Worms Project\\TS-data-only\\worms.arff"); out.writeLine("@Relation worms"); for(int j=0;j<newSeries[0].length;j++) out.writeLine("@attribute eigenWorm1_"+(j+1)+" numeric"); out.writeString("@attribute type {"); for(int j=0;j<classLabels.length-1;j++) out.writeString(classLabels[j]+","); out.writeLine(classLabels[classLabels.length-1]+"}"); out.writeLine("\n@data\n"); int[] classCounts=new int[classLabels.length]; for(int i=0;i<nosSeries;i++){ for(int j=0;j<newSeries[i].length;j++){ out.writeString(df.format(newSeries[i][j])+","); } labels[i]=labels[i].trim(); if(labels[i].equals("goa-1")) System.out.println(labels[i]); switch(labels[i]){ case "N2": out.writeString("N2"); classCounts[0]++; break; case "goa-1": out.writeString("goa1"); classCounts[1]++; break; case "unc-1": out.writeString("unc1"); classCounts[2]++; break; case "unc-38": out.writeString("unc38"); classCounts[3]++; break; case "unc-63": out.writeString("unc63"); classCounts[4]++; break; } out.writeString("\n"); } for(int i=0;i<classCounts.length;i++) System.out.println(" Label "+classLabels[i]+" has "+classCounts[i]+" cases"); /* Label goa1 has 109 cases Label N2 has 44 cases Label unc1 has 35 cases Label unc38 has 45 cases Label unc63 has 25 cases */ } public static void makeTestTrainSplit(){ int[] overallSize={109,44,35,45,25}; int[] testSize={33,13,10,13,8}; Instances all=ClassifierTools.loadData(path+"worms"); Instances train=new Instances(all); Instances test=new Instances(all,0); int pos=0; for(int i=0;i<testSize.length;i++){ System.out.println(" Extracting class "+i); for(int j=0;j<testSize[i];j++){//Find if(train.instance(pos).classValue()==i){ test.add(train.instance(pos)); train.delete(pos); System.out.println("moving "+pos+" class "+i); }else if(pos<train.numInstances()){ j--; pos++; while(pos<train.numInstances()&& train.instance(pos).classValue()!=i) pos++; } } OutFile trainF=new OutFile(path+"worms_TRAIN.arff"); trainF.writeString(train.toString()); OutFile testF=new OutFile(path+"worms_TEST.arff"); testF.writeString(test.toString()); } } public static void basicShapeletTestTrain(){ Instances train=ClassifierTools.loadData(path+"worms_TRAIN"); Instances test=ClassifierTools.loadData(path+"worms_TEST"); NormalizeCase nc = new NormalizeCase(); try { train=nc.process(train); test=nc.process(test); } catch (Exception ex) { Logger.getLogger(Worms.class.getName()).log(Level.SEVERE, null, ex); } int nosShapelets=2000; FullShapeletTransform st=new ShapeletTransform(); st.setNumberOfShapelets(nosShapelets); int minLength=4; int maxLength=200; st.setShapeletMinAndMax(minLength, maxLength); st.setQualityMeasure(QualityMeasures.ShapeletQualityChoice.F_STAT); Instances shapeletTrain=null; Instances shapeletTest=null; try { shapeletTrain=st.process(train); shapeletTest=st.process(test); } catch (Exception ex) { System.out.println("Error performing the shapelet transform"+ex); ex.printStackTrace(); System.exit(0); } System.out.println(" Transform is complete"); OutFile of = new OutFile(path+"shapeletWorms_TRAIN"); of.writeString(shapeletTrain.toString()); of = new OutFile(path+"shapeletWorms_TEST"); of.writeString(shapeletTest.toString()); //Build Classifiers ArrayList<String> names=new ArrayList<>(); Classifier[] c = HandandBoneOutlines.setSingleClassifiers(names); for(int i=0;i<c.length;i++){ System.out.print(" CLASSIFIER ="+names.get(i)); double accDistal=ClassifierTools.singleTrainTestSplitAccuracy(c[i], shapeletTrain,shapeletTest); System.out.println(" Acc ="+accDistal); } } public static void summaryStatsTestTrain(){ Instances train=ClassifierTools.loadData(path+"worms_TRAIN"); Instances test=ClassifierTools.loadData(path+"worms_TEST"); NormalizeCase nc = new NormalizeCase(); try { train=nc.process(train); test=nc.process(test); SummaryStats ss=new SummaryStats(); train=ss.process(train); test=ss.process(test); //Build Classifiers ArrayList<String> names=new ArrayList<>(); Classifier[] c = HandandBoneOutlines.setSingleClassifiers(names); for(int i=0;i<c.length;i++){ System.out.print(" CLASSIFIER ="+names.get(i)); double accDistal=ClassifierTools.singleTrainTestSplitAccuracy(c[i], train,test); System.out.println(" Acc ="+accDistal); } } catch (Exception ex) { Logger.getLogger(Worms.class.getName()).log(Level.SEVERE, null, ex); } } public static void main(String[] args){ int a,b=3,c=20,d=5; double x=3.5; System.out.println("a="+(b*c/d)); System.out.println("a="+b/c*d); a=b/(c*d); a=(b/c)*d; a=c/b; a=c%b; //a=c/x; System.out.println("a="+c/(int)x); System.out.println("a="+(int)(c/x)); String test="switch"; switch(test){ case "HELLO": System.out.println("Hello"); break; } // formatArff(); // makeTestTrainSplit(); // Instances data = ClassifierTools.loadData(path+"worms"); // basicShapeletTestTrain(); // summaryStatsTestTrain(); } }