Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
bulva
Sędziwy Jeż
Posty: 60 Rejestracja: 28 wrz 2009, 12:40
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Post
autor: bulva » 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));
}
}
Struchu
Serdeczny Borsuk
Posty: 116 Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Post
autor: Struchu » 15 lip 2010, 15:51
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ż
Posty: 60 Rejestracja: 28 wrz 2009, 12:40
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Post
autor: bulva » 16 lip 2010, 10:24
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.
Struchu
Serdeczny Borsuk
Posty: 116 Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Post
autor: Struchu » 16 lip 2010, 19:02
Taka uwaga: porównywanie wartości logicznych w warunkach tylko zmniejsza czytelność kodu. Zdecydowanie wystarczy:
Ma zielone, kocie oczy...
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 18 gości