[java] Liczenie średniej z tablicy gdy niektóre wartości są NaN
: 15 lip 2010, 12:11
Witam, piszę kod z wykorzystaniem bibliotek Weka, który w pętli zbiera pewne wartości do tablic. Z różnych (numerycznych) powodów w niektórych przebiegach pętli wartości te są nie mogą być policzone (zwracane jest NaN). Mimo to chciałbym aby kod liczył średnią z tych tablic po prostu omijając te wiersze tablic dzie są wartości NaN. Jak to napisać? Mój kod:
Kod: Zaznacz cały
import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import weka.core.*;
import weka.classifiers.*;
import weka.classifiers.evaluation.*;
import weka.classifiers.functions.LibSVM;
public class Project_SVM_loop{
public static double getAverage(double[] numbers)
{
double total = 0.0;
for (int col = 0; col<numbers.length; col++)
{
total +=numbers[col];
}
return total/numbers.length;
}
public static void main(String[] args) throws Exception {
// load data
Instances data = new Instances(
new BufferedReader(
new FileReader("/home/data/Lymphoma.arff")));
data.setClassIndex(data.numAttributes() - 1);
int n = 100;
double ROC[] = new double[n];
double ACC[] = new double[n];
for (int i=0;i<n;i++){
Random random = new Random();
data.randomize(random);
double percent = 90.0;
int trainSize = (int) Math.round(data.numInstances() * percent / 100);
int testSize = data.numInstances() - trainSize;
Instances train = new Instances(data, 0, trainSize);
Instances test = new Instances(data, trainSize, testSize);
// train classifier
Classifier cl = new LibSVM();
cl.buildClassifier(train);
// evaluate classifier
Evaluation eval = new Evaluation(test);
eval.evaluateModel(cl, test);
// generate curve
ThresholdCurve tc = new ThresholdCurve();
int classIndex = 0;
Instances result = tc.getCurve(eval.predictions(), classIndex);
ROC[i] = Double.parseDouble(Utils.doubleToString(tc.getROCArea(result), 4));
ACC[i] = eval.pctCorrect();
}
for(int i=0; i<n;i++)
{
System.out.println("--------------");
System.out.println("Acc: "+ACC[i]);
System.out.println("AUC: "+ROC[i]);
}
System.out.println("======================================");
System.out.println("Average accuracy: " + getAverage(ACC));
System.out.println("Average AUC: " + getAverage(ROC));
}
}