2010-02-16 12 views
6

Ho un file ARFF contenente 14 colonne numeriche. Voglio eseguire una normalizzazione su ogni colonna separatamente, ovvero modificare i valori da ogni colonna a (actual_value - min(this_column))/(max(this_column) - min(this_column)). Quindi, tutti i valori di una colonna saranno compresi nell'intervallo [0, 1]. I valori min e max di una colonna potrebbero differire da quelli di un'altra colonna.Colonne di normalizzazione Weka

Come posso fare questo con i filtri Weka?

Grazie

risposta

8

Questo può essere fatto utilizzando

weka.filters.unsupervised.attribute.Normalize 

Dopo l'applicazione di questo filtro tutti i valori in ogni colonna sarà nel range [0, 1]

+0

può solo io l'output del file ARFF normalizzata dopo che ho normalizzato e prima di eseguire i classificatori? (Vorrei salvarlo su disco) – aneuryzm

1

Proprio così. Volevo solo ricordare la differenza tra "normalizzazione" e "standardizzazione". Ciò che viene menzionato nella domanda è "standardizzazione", mentre la "normalizzazione" assume la distribuzione gaussiana e si normalizza in base alla media e la variazione standard di ciascun attributo. Se si dispone di un valore anomalo nei dati, il filtro di standardizzazione potrebbe danneggiare la distribuzione dei dati in quanto il valore minimo o massimo potrebbe essere molto più lontano rispetto alle altre istanze.

+1

No, la domanda ha ragione, la descrivi esattamente nel modo sbagliato: http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

Ecco l'esempio di normalizzazione di lavoro con K-Means in 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()); 

Se si dispone di un file CSV quindi sostituire la linea BufferedReader sopra con sotto menzionato Datasource:

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