2010-02-16 16 views
6

Mam plik ARFF zawierający 14 kolumn numerycznych. Chcę przeprowadzić normalizację każdej kolumny osobno, czyli modyfikowanie wartości z każdej kolumny do (actual_value - min(this_column))/(max(this_column) - min(this_column)). W związku z tym wszystkie wartości z kolumny będą w zakresie [0, 1]. Wartości min i maksimum z kolumny mogą różnić się od wartości z innej kolumny.Normalizujące kolumny Weka

Jak mogę to zrobić z filtrami Weka?

Dzięki

Odpowiedz

8

Można to zrobić za pomocą

weka.filters.unsupervised.attribute.Normalize 

Po zastosowaniu tego filtra wszystkie wartości w każdej kolumnie będzie w przedziale [0, 1]

+0

Can I właśnie wyjście znormalizowany plików arff po to mam znormalizowane i przed uruchomić klasyfikatorów? (Chciałbym zapisać go na dysku) – aneuryzm

1

Zgadza się. Chciałem tylko przypomnieć o różnicy "normalizacji" i "standaryzacji". To, o czym mowa w pytaniu, to "standaryzacja", podczas gdy "normalizacja" zakłada dystrybucję Gaussa i normalizuje ją poprzez średnią i standardową zmienność każdego atrybutu. Jeśli masz w swoich danych wartość odstającą, filtr standaryzacyjny może zaszkodzić dystrybucji danych jako min, lub max może być znacznie dalej niż w innych przypadkach.

+1

Nie, pytanie jest właściwe, opisujesz to dokładnie w niewłaściwy sposób: http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

Oto działający przykład normalizacji z K-średnich w JAVA.

final SimpleKMeans kmeans = new SimpleKMeans(); 

final String[] options = weka.core.Utils 
     .splitOptions("-init 0 -max-candidates 100 -periodic-pruning 10000 -min-density 2.0 -t1 -1.25 -t2 -1.0 -N 10 -A \"weka.core.EuclideanDistance -R first-last\" -I 500 -num-slots 1 -S 50"); 
kmeans.setOptions(options); 

kmeans.setSeed(10); 
kmeans.setPreserveInstancesOrder(true); 
kmeans.setNumClusters(25); 
kmeans.setMaxIterations(1000); 

final BufferedReader datafile = new BufferedReader(new FileReader("/Users/data.arff"); 
Instances data = new Instances(datafile); 

//normalize 
final Normalize normalizeFilter = new Normalize(); 
normalizeFilter.setInputFormat(data); 
data = Filter.useFilter(data, normalizeFilter); 

//remove class column[0] from cluster 
data.setClassIndex(0); 
final Remove removeFilter = new Remove(); 
removeFilter.setAttributeIndices("" + (data.classIndex() + 1)); 
removeFilter.setInputFormat(data); 
data = Filter.useFilter(data, removeFilter); 

kmeans.buildClusterer(data); 

System.out.println(kmeans.toString()); 

// evaluate clusterer 
final ClusterEvaluation eval = new ClusterEvaluation(); 
eval.setClusterer(kmeans); 
eval.evaluateClusterer(data); 
System.out.println(eval.clusterResultsToString()); 

Jeśli masz plik CSV następnie zastąpić linię BufferedReader powyżej poniżej wspomnianej Datasource:

final DataSource source = new DataSource("/Users/data.csv"); 
final Instances data = source.getDataSet();