/** Class NormalizeAttribute.java
*
* @author AJB
* @version 1
* @since 14/4/09
*
* Class normalizes attributes, basic version. Assumes no missing values.
*
* Normalise onto [0,1] if norm==NormType.INTERVAL,
* Normalise onto Normal(0,1) if norm==NormType.STD_NORMAL,
*
*
*/
package weka.filters;
import weka.core.Instances;
public class NormalizeCase extends SimpleBatchFilter{
public enum NormType {INTERVAL,STD,STD_NORMAL};
NormType norm=NormType.STD;
public void setNormType( NormType n){norm=n;}
/*
*
*/
protected Instances determineOutputFormat(Instances inputFormat){
Instances result = new Instances(inputFormat, 0);
return result;
}
public Instances process(Instances inst) throws Exception {
//Clone the
Instances result = new Instances(inst);
switch(norm){
case INTERVAL: //Map onto [0,1]
intervalNorm(result);
break;
case STD: //Subtract the mean of the series
standard(result);
break;
case STD_NORMAL: //Transform to zero mean, unit variance
standardNorm(result);
break;
default:
}
return result;
}
/* Wont normalise the class value*/
public void intervalNorm(Instances r){
double max,min;
for(int i=0;i<r.numInstances();i++){
max=Double.MIN_VALUE;
min=Double.MAX_VALUE;
for(int j=0;j<r.numAttributes();j++){
if(j!=r.classIndex()){
double x=r.instance(i).value(j);
if(x>max)
max=x;
if(x<min)
min=x;
}
}
for(int j=0;j<r.numAttributes();j++){
if(j!=r.classIndex()){
double x=r.instance(i).value(j);
r.instance(i).setValue(j,(x-min)/(max-min));
}
}
}
}
public void standard(Instances r) throws Exception{
double mean,sum,sumSq,stdev,x,y;
int size=r.numAttributes();
int classIndex=r.classIndex();
if(classIndex>0)
size--;
for(int i=0;i<r.numInstances();i++)
{
sum=sumSq=mean=stdev=0;
for(int j=0;j<r.numAttributes();j++){
if(j!=classIndex){
x=r.instance(i).value(j);
sum+=x;
}
mean=sum/size;
}
for(int j=0;j<r.numAttributes();j++){
if(j!=classIndex){
x=r.instance(i).value(j);
r.instance(i).setValue(j,(x-mean));
}
}
}
}
public static void standardNorm(double[] r) throws Exception{
double sum=0,sumSq=0,mean=0,stdev=0;
for(int i=0;i<r.length;i++){
sum+=r[i];
sumSq+=r[i]*r[i];
}
stdev=(sumSq-sum*sum/r.length)/r.length;
mean=sum/r.length;
if(stdev==0)
throw new Exception("Cannot normalise a series with zero variance! mean ="+mean+" sum = "+sum+" sum sq = "+sumSq);
stdev=Math.sqrt(stdev);
for(int i=0;i<r.length;i++)
r[i]=(r[i]-mean)/stdev;
}
public void standardNorm(Instances r) throws Exception{
double mean,sum,sumSq,stdev,x;
int size=r.numAttributes();
int classIndex=r.classIndex();
if(classIndex>=0)
size--;
for(int i=0;i<r.numInstances();i++)
{
sum=sumSq=mean=stdev=0;
for(int j=0;j<r.numAttributes();j++){
if(j!=classIndex){
x=r.instance(i).value(j);
sum+=x;
sumSq+=x*x;
}
}
stdev=(sumSq-sum*sum/size)/size;
mean=sum/size;
stdev=Math.sqrt(stdev);
if(stdev==0)
throw new Exception("Cannot normalise a series with zero variance! Instance number ="+i+" mean ="+mean+" sum = "+sum+" sum sq = "+sumSq+" instance ="+r.instance(i));
for(int j=0;j<r.numAttributes();j++){
if(j!=classIndex){
x=r.instance(i).value(j);
r.instance(i).setValue(j,(x-mean)/(stdev));
}
}
}
}
public String globalInfo() {
// TODO Auto-generated method stub
return null;
}
public String getRevision() {
// TODO Auto-generated method stub
return null;
}
static String[] fileNames={ //Number of train,test cases,length,classes
"Beef", //30,30,470,5
"Coffee", //28,28,286,2
"OliveOil",
"Earthquakes",
"Ford_A",
"Ford_B"
};
static String path="C:\\Research\\Data\\Time Series Data\\Time Series Classification\\";
public static void main(String[] args){
}
}