colonnes de normalisation Weka
-
20-09-2019 - |
Question
J'ai un fichier ARFF contenant 14 colonnes numériques. Je souhaite effectuer une normalisation de chaque colonne séparément, qui est en train de modifier les valeurs de chaque colum à (actual_value - min(this_column)) / (max(this_column) - min(this_column)
). Par conséquent, toutes les valeurs d'une colonne seront dans la gamme [0, 1]
. Les valeurs min et max à partir d'une colonne peuvent être différents de ceux d'une autre colonne.
Comment puis-je faire avec les filtres Weka?
Merci
La solution
Cela peut être fait en utilisant
weka.filters.unsupervised.attribute.Normalize
Après application de ce filtre toutes les valeurs dans chaque colonne sont dans l'intervalle [0, 1]
Autres conseils
C'est vrai. Je voulais juste rappeler la différence de « normalisation » et « normalisation ». Que mentionné dans la question est « normalisation », alors que la « normalisation » suppose la distribution gaussienne et normalise par moyenne et écart type de chaque attribut. Si vous avez une valeur aberrante dans vos données, le filtre Standardiser pourrait nuire à votre distribution de données comme min ou max pourrait être beaucoup plus loin que les autres cas.
Voici l'exemple de normalisation travaillant avec K-Means en 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());
Si vous avez un fichier CSV puis remplacez la ligne BufferedReader ci-dessus avec la source de données mentionnées ci-dessous:
final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();