Weka нормализующие столбцы - PullRequest
       17

Weka нормализующие столбцы

6 голосов
/ 16 февраля 2010

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

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 18 февраля 2010

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

weka.filters.unsupervised.attribute.Normalize

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

1 голос
/ 05 июля 2011

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

0 голосов
/ 19 сентября 2017

Вот пример рабочей нормализации с 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 выше на упомянутый ниже источник данных:

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