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

È stato utile?

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top