2010-02-16 4 views
6

J'ai un fichier ARFF contenant 14 colonnes numériques. Je veux effectuer une normalisation sur chaque colonne séparément, ce qui modifie les valeurs de chaque colonne à (actual_value - min(this_column))/(max(this_column) - min(this_column)). Par conséquent, toutes les valeurs d'une colonne seront dans la plage [0, 1]. Les valeurs min et max d'une colonne peuvent différer de celles d'une autre colonne. Comment puis-je faire avec les filtres Weka?Colonnes de normalisation Weka

Merci

Répondre

8

Cela peut être fait en utilisant

weka.filters.unsupervised.attribute.Normalize 

Après avoir appliqué ce filtre toutes les valeurs dans chaque colonne sera dans l'intervalle [0, 1]

+0

peut juste que je sortie le fichier arff normalisé après que je l'ai normalisé et avant d'exécuter les classificateurs? (Je voudrais l'enregistrer sur le disque) – aneuryzm

1

C'est vrai. Je voulais juste rappeler la différence de "normalisation" et "normalisation". Ce qui est mentionné dans la question est "normalisation", tandis que "normalisation" suppose une distribution gaussienne et normalise par la moyenne, et une variation standard de chaque attribut. Si vous avez une valeur aberrante dans vos données, le filtre normalisé peut nuire à la distribution de vos données, car la valeur min ou max peut être beaucoup plus élevée que les autres instances.

+1

Non, la question a-t-elle raison, vous le décrivez exactement à l'envers: http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

Voici l'exemple de normalisation de travail avec K-Means dans 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 remplacer la ligne BufferedReader ci-dessus avec la source de données mentionné ci-dessous:

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