/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package development;
import fileIO.OutFile;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Random;
import statistics.simulators.SimulateAR;
import statistics.simulators.SimulatePowerSpectrum;
import utilities.ClassifierTools;
import weka.classifiers.Classifier;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.timeseries.FFT;
import weka.filters.timeseries.PowerCepstrum;
import weka.filters.timeseries.PowerSpectrum;
/**
*
* @author ajb
*/
public class SpectralTransformComparison extends Thread{
int m;
Classifier[] c;
public static String path ="C:\\Users\\ajb\\Dropbox\\Results\\SpectralDomain\\Experiment1\\";
//Does the whole experiment for a certain length of series
public SpectralTransformComparison(int length){
m=length;
}
public static int MIN_PARAS_EXP1=2;
public static int MAX_PARAS_EXP1=10;
public void run(){
// Set up the
int nosCases=400;
int[] nosCasesPerClass={nosCases/2,nosCases/2};
int runs=50;
int minParas=2;
int maxParas=10;
ArrayList<String> names=new ArrayList<>();
Random rand = new Random();
c=ACFDomainClassification.setSingleClassifiers(names);
int length=m;
try{
int nosTrans=3;
Instances[] train=new Instances[nosTrans];
Instances[] test=new Instances[nosTrans];
double[][] sum=new double[train.length][c.length];
double[][] sumSq=new double[train.length][c.length];
PowerSpectrum ps = new PowerSpectrum();
PowerCepstrum pc= new PowerCepstrum();
pc.useFFT();
FFT fft=new FFT();
OutFile of = new OutFile(path+"mean_"+m+".csv");
OutFile of2 = new OutFile(path+"sd_"+m+".csv");
System.out.println(" Running length ="+m);
of.writeLine("classifier,PS,PC,FFT");
of2.writeLine("classifier,PS,PC,FFT");
for(int i=0;i<runs;i++){
//Generate data AND SET NOISE LEVEL
c=ACFDomainClassification.setSingleClassifiers(names);
if(i%10==0)
System.out.println(" m ="+m+" performing run ="+i);
train = new Instances[nosTrans];
test = new Instances[nosTrans];
//Change to simulate sin waves.
Instances rawTrain=SimulatePowerSpectrum.generateFFTDataSet(minParas,maxParas,length,nosCasesPerClass,true);
rawTrain.randomize(rand);
Instances rawTest = new Instances(rawTrain,0);
for(int k=0;k<nosCases/2;k++){
Instance r=rawTrain.remove(0);
rawTest.add(r);
}
//Generate transforms
train[0]=ps.process(rawTrain);
train[1]=pc.process(rawTrain);
train[2]=fft.process(rawTrain);
test[0]=ps.process(rawTest);
test[1]=pc.process(rawTest);
test[2]=fft.process(rawTest);
//Measure classification accuracy
for(int j=0;j<test.length;j++){
for(int k=0;k<c.length;k++){
double a=ClassifierTools.singleTrainTestSplitAccuracy(c[k], train[j], test[j]);
sum[j][k]+=a;
sumSq[j][k]+=a*a;
}
}
}
DecimalFormat df= new DecimalFormat("###.###");
System.out.print("\n m="+length);
for(int j=0;j<c.length;j++){
of.writeString(names.get(j)+",");
of2.writeString(names.get(j)+",");
for(int i=0;i<test.length;i++){
sum[i][j]/=runs;
sumSq[i][j]=sumSq[i][j]/runs-sum[i][j]*sum[i][j];
System.out.print(","+df.format(sum[i][j])+" ("+df.format(sumSq[i][j])+")");
of.writeString(df.format(sum[i][j])+",");
of2.writeString(df.format(sumSq[i][j])+",");
}
of.writeString("\n");
of2.writeString("\n");
}
}catch(Exception e){
System.out.println(" Error ="+e);
e.printStackTrace();
System.exit(0);
}
}
public static void main(String[] args){
SpectralTransformComparison[] c= new SpectralTransformComparison[10];
for(int i=0;i<10;i++){
c[i]=new SpectralTransformComparison((i+1)*100);
c[i].start();
}
try{
for(int i=0;i<c.length;i++)
c[i].join();
}catch(Exception e){
System.out.println(" Error "+e);
}
}
}