/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package development;
import fileIO.OutFile;
import statistics.simulators.*;
import utilities.ClassifierTools;
import weka.classifiers.lazy.DTW_kNN;
import weka.classifiers.lazy.kNN;
import weka.core.Instances;
import weka.filters.NormalizeCase;
/**
*
* @author ajb
*/
public class TimeDomainClassification {
public static void EuclideanVsDTWParameterTest(String s, boolean warp){
OutFile of = new OutFile(s);
int[] sizes={10,100,300,500,1000,2000};
int testSize=200;
double[][] modelParas={{0,0,1},{0,0,1}};
int seriesLength=100;
int reps=10;
int[] testCases={testSize/2,testSize/2};
double paraInterval=0.1;
double[] paraDiffs={0.01,0.02,0.05,0.1};
for(int i=0; i<1/paraInterval;i++){
modelParas[0][1]=0;
modelParas[1][1]=0;
modelParas[0][2]=1;
modelParas[1][2]=1;
for(int j=0; j<1/paraInterval;j++){
for(int k=0; k<1/paraInterval;k++){
of.writeString(modelParas[0][0]+","+modelParas[0][1]+","+modelParas[0][2]);
//For each parameter set
for(int q=0;q<modelParas[0].length;q++){
for(int p=0;p<modelParas[0].length;p++)
modelParas[1][p]=modelParas[0][p];
modelParas[1][q]+=paraDiffs[0];
for(int p=0;p<sizes.length;p++){
int n=sizes[p];
double accEuclid=0;
double accDTW=0;
for(int m=0;m<reps;m++){
DataSimulator ds;
if(warp){
SimulateTimeDomain sim = new SimulateTimeDomain(modelParas);
sim.setWarping();
ds=sim;
}
else
ds = new SimulateTimeDomain(modelParas);
int[] casesPerClass={n/2,n/2};
Instances train=ds.generateDataSet(seriesLength, casesPerClass);
Instances test=ds.generateDataSet(seriesLength, testCases);
kNN euclid= new kNN(1);
DTW_kNN dtw= new DTW_kNN(1);
dtw.setMaxR(0.1);
// dtw.optimiseWindow(false);
accEuclid+=ClassifierTools.singleTrainTestSplitAccuracy(euclid, train, test);
accDTW+=ClassifierTools.singleTrainTestSplitAccuracy(dtw, train, test);
}
of.writeString(n+","+accEuclid/reps+","+accDTW/reps);
System.out.println(n+","+accEuclid/reps+","+accDTW/reps);
}
}
of.writeString("\n");
}
modelParas[0][1]+=paraInterval;
}
modelParas[0][0]+=paraInterval;
}
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Does 1NN Euclidean tend to DTW as train set size increase?">
public static void EuclideanVsDTWSimulation(String s, boolean warp){
OutFile of = new OutFile(s);
int startN=10, endN=5000, increment=10;
int testSize=100;
double[][] modelParas={{0,0.02,1},{0,0.019,1}};
int seriesLength=100;
int reps=10;
int[] testCases={testSize/2,testSize/2};
for(int n=startN;n<=endN;n+=increment){
System.out.println(" Evaluating for "+n+" training cases");
//Generate random data set with n training cases and testSize test casesj+
double accEuclid=0;
double accDTW=0;
for(int j=0;j<reps;j++){
DataSimulator ds;
if(warp){
SimulateTimeDomain sim = new SimulateTimeDomain(modelParas);
sim.setWarping();
ds=sim;
}
else
ds = new SimulateTimeDomain(modelParas);
int[] casesPerClass={n/2,n/2};
Instances train=ds.generateDataSet(seriesLength, casesPerClass);
Instances test=ds.generateDataSet(seriesLength, testCases);
kNN euclid= new kNN(1);
DTW_kNN dtw= new DTW_kNN(1);
dtw.setMaxR(0.1);
// dtw.optimiseWindow(false);
accEuclid+=ClassifierTools.singleTrainTestSplitAccuracy(euclid, train, test);
accDTW+=ClassifierTools.singleTrainTestSplitAccuracy(dtw, train, test);
}
of.writeLine(n+","+accEuclid/reps+","+accDTW/reps);
System.out.println(n+","+accEuclid/reps+","+accDTW/reps);
}
}
//</editor-fold>
public static void nearestNeighbour(boolean crossV){
String[] files=TimeSeriesClassification.fileNames;
OutFile of;
if(crossV)
of= new OutFile("C:\\Users\\ajb\\Dropbox\\Results\\TimeDomain\\CV_NN_UCR.csv");
else
of= new OutFile("C:\\Users\\ajb\\Dropbox\\Results\\TimeDomain\\1_NN_UCR.csv");
try{
for(int i=0;i<files.length;i++){
System.gc();
System.out.println(" Problem file ="+files[i]);
Instances train=ClassifierTools.loadData("C:\\Users\\ajb\\Dropbox\\TSC Problems\\"+files[i]+"\\"+files[i]+"_TRAIN");
Instances test=ClassifierTools.loadData("C:\\Users\\ajb\\Dropbox\\TSC Problems\\"+files[i]+"\\"+files[i]+"_TEST");
NormalizeCase nc = new NormalizeCase();
train=nc.process(train);
test=nc.process(test);
kNN knn=null;
double a;
if(crossV){
knn= new kNN(100);
knn.setCrossValidate(crossV);
knn.buildClassifier(train);
knn.normalise(false);
a=ClassifierTools.accuracy(test,knn);
}
else{
knn= new kNN(1);
knn.normalise(false);
knn.buildClassifier(train);
a=ClassifierTools.accuracy(test,knn);
}
of.writeLine(files[i]+","+a);
System.out.println(files[i]+","+a);
}
}catch(Exception e){
System.out.println(" Error ="+e);
e.printStackTrace();
System.exit(0);
}
}
public static void main(String[] args){
String str="ARSENAL";
switch(str){
case "TOTTS":
break;
case "ARSENAL":
}
// nearestNeighbour(true);
// nearestNeighbour(false);
/* OutFile of = new OutFile("C:\\Users\\ajb\\Dropbox\\Results\\TimeDomain\\EuclidVsDTWResults\\test.csv");
double[][] modelParas={{0,0.02,1},{0,0.019,1}};
int seriesLength=100;
Model.setDefaultSigma(1);
SimulateTimeDomain sim=new SimulateTimeDomain(modelParas);
// sim.setWarping();
DataSimulator ds= sim;
System.out.println("Model 0 variance ="+ds.getModels().get(0).getVariance());
int[] casesPerClass={1,1};
Instances train=ds.generateDataSet(seriesLength, casesPerClass);
of.writeString(train.toString());
Model.setDefaultSigma(1);
*/
String results="C:\\Users\\ajb\\Dropbox\\Results\\TimeDomain\\EuclidVsDTWResults\\WithWarpingTest1.csv";
EuclideanVsDTWSimulation(results,true);
}
}