Pregunta

Tengo un archivo ARFF que contiene 14 columnas numéricas. Quiero realizar una normalización en cada columna por separado, que está modificando los valores de cada colum a (actual_value - min(this_column)) / (max(this_column) - min(this_column)). Por lo tanto, todos los valores de una columna estarán en el [0, 1] gama. Los valores mínimo y máximo de una columna pueden diferir de los de otra columna.

¿Cómo puedo hacer esto con filtros Weka?

Gracias

¿Fue útil?

Solución

Esto se puede hacer utilizando

weka.filters.unsupervised.attribute.Normalize

Después de aplicar este filtro todos los valores en cada columna estarán en el rango [0, 1]

Otros consejos

Eso es correcto. Sólo quería recordarles acerca de la diferencia de "normalización" y "estandarización". Lo que se menciona en la pregunta es "estandarización", mientras que "normalización" asume la distribución de Gauss y normaliza por la media y desviación típica de cada atributo. Si usted tiene un valor atípico en los datos, el filtro estandarizado podría hacerle daño a su distribución de datos como los valores mínimo, máximo o podría ser mucho más lejos que los otros casos.

Este es el ejemplo de normalización trabajar con K-medias 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 usted tiene un archivo CSV a continuación, reemplace la línea anterior con BufferedReader mencionado a continuación origen de datos:

final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top