2010-02-16 1 views
6

У меня есть файл ARFF, содержащий 14 числовых столбцов. Я хочу выполнить нормализацию по каждому столбцу отдельно, что изменяет значения из каждого столбца на (actual_value - min(this_column))/(max(this_column) - min(this_column)). Следовательно, все значения из столбца будут находиться в диапазоне [0, 1]. Значения min и max из столбца могут отличаться от значений в столбце другого столбца.Weka normalizing columns

Как это сделать с фильтрами Weka?

Благодаря

ответ

8

Это может быть сделано с помощью

weka.filters.unsupervised.attribute.Normalize 

После применения этого фильтра все значения в каждом столбце будет находиться в диапазоне [0, 1]

+0

Может только I выход нормированный ARFF файла после того как я нормализуется его и, прежде чем запустить классификаторы? (Я хотел бы сохранить его на диске) – aneuryzm

1

Это верно. Просто хотел напомнить о различии «нормализации» и «стандартизации». То, что упоминалось в вопросе, - это «стандартизация», тогда как «нормализация» предполагает гауссовское распределение и нормализуется по среднему значению и стандартная вариация каждого атрибута. Если у вас есть выброс в ваших данных, фильтр стандартизации может повредить ваше распределение данных, так как min или max могут быть намного дальше, чем другие экземпляры.

+1

Нет, вопрос в порядке, вы описываете его точно так же: http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

Вот пример нормализации работы с K-Means в 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()); 

Если у вас есть CSV файл затем заменить BufferedReader строку выше указанной ниже Datasource:

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