Pergunta

Eu tenho um arquivo ARFF contendo 14 colunas numéricas. Eu quero realizar uma normalização em cada coluna separadamente, que está modificando os valores de cada colum para (actual_value - min(this_column)) / (max(this_column) - min(this_column)). Portanto, todos os valores de uma coluna estarão no intervalo [0, 1]. Os valores MIN e MAX de uma coluna podem diferir dos de outra coluna.

Como posso fazer isso com os filtros Weka?

Obrigado

Foi útil?

Solução

Isso pode ser feito usando

weka.filters.unsupervised.attribute.Normalize

Depois de aplicar este filtro, todos os valores em cada coluna estarão no intervalo [0, 1

Outras dicas

Isso mesmo. Só queria lembrar a diferença de "normalização" e "padronização". O que mencionado na pergunta é "padronização", enquanto a "normalização" assume a distribuição gaussiana e normaliza por média e variação padrão de cada atributo. Se você tiver um outlier em seus dados, o filtro padronizado poderá prejudicar sua distribuição de dados, pois o min, ou o máximo pode estar muito mais longe do que as outras instâncias.

Aqui está o exemplo de normalização do trabalho com K-means em 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 você possui arquivo CSV, substitua a linha BufferredReader acima por DataSource abaixo mencionado:

final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top