[java] Liczenie średniej z tablicy gdy niektóre wartości są NaN

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
bulva
Sędziwy Jeż
Sędziwy Jeż
Posty: 60
Rejestracja: 28 wrz 2009, 12:40
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

[java] Liczenie średniej z tablicy gdy niektóre wartości są NaN

Post autor: bulva »

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));

	}
}
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [java] Liczenie średniej z tablicy gdy niektóre wartości są NaN

Post autor: Struchu »

Ja bym to zrobił tak:

Kod: Zaznacz cały

public static double getAverage(double[] numbers) 
{
    double total = 0.0;
    double count = 0.0;
    for (int col = 0; col<numbers.length; col++)
    {
            if(numbers[col] != Double.NaN) {
                  total += numbers[col];
                  count += 1.0;
            }
     }
     if(count != 0.0) {
            return total/count;
     } else {
            // jakby były same NaNy
            return Double.NaN;
     }
}
Ma zielone, kocie oczy...
bulva
Sędziwy Jeż
Sędziwy Jeż
Posty: 60
Rejestracja: 28 wrz 2009, 12:40
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [java] Liczenie średniej z tablicy gdy niektóre wartości są NaN

Post autor: bulva »

Zrobiłem w końcu tak:

Kod: Zaznacz cały

public static double getAverage(double[] numbers) 
	{
	double total = 0.0;
for (int col = 0; col<numbers.length; col++)
{
	if (Double.isNaN(numbers[col])==false) {
	total +=numbers[col];
	}
}
return total/numbers.length;
	}
Doda Twój warunek na same NaN, faktycznie lepiej kod zabezpieczyć na taki wypadek.
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [java] Liczenie średniej z tablicy gdy niektóre wartości są NaN

Post autor: Struchu »

Taka uwaga: porównywanie wartości logicznych w warunkach tylko zmniejsza czytelność kodu. Zdecydowanie wystarczy:

Kod: Zaznacz cały

if (!Double.isNan(numbers[col]) ...
Ma zielone, kocie oczy...
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości