colonne normalizzare weka
-
20-09-2019 - |
Domanda
Ho un file ARFF contenente 14 colonne numeriche. Voglio eseguire una normalizzazione su ogni colonna separatamente, che sta modificando i valori da ogni colum a (actual_value - min(this_column)) / (max(this_column) - min(this_column)
). Quindi, tutti i valori di una colonna sarà nell'intervallo [0, 1]
. I valori Min e Max da una colonna potrebbero differire da quelli di un'altra colonna.
Come posso fare questo con filtri Weka?
Grazie
Soluzione
Questo può essere fatto utilizzando
weka.filters.unsupervised.attribute.Normalize
Dopo aver applicato questo filtro tutti i valori di ogni colonna sarà nell'intervallo [0, 1]
Altri suggerimenti
Questo è giusto. Volevo solo ricordare circa la differenza di "normalizzazione" e "standardizzazione". Quanto detto in questione è "standardizzazione", mentre "normalizzazione" assume distribuzione gaussiana e normalizza per mezzo, e variazione standard di ciascun attributo. Se si dispone di un outlier nei dati, il filtro standardizzare potrebbe ferire la distribuzione dei dati come il minimo, o massimo potrebbe essere molto più lontano rispetto alle altre istanze.
Ecco l'esempio di normalizzazione a lavorare 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 origine dati:
final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();