我有一个包含14个的数值列的ARFF文件。我想执行上分开的各列的归一化,从每个式柱修改值(actual_value - min(this_column)) / (max(this_column) - min(this_column))。因此,从一列的所有值将在范围[0, 1]。从一列中的最低和最高值可能不同于另一列的不同。

我怎样才能做到这一点用WEKA过滤器?

由于

有帮助吗?

解决方案

此可使用来完成

weka.filters.unsupervised.attribute.Normalize

应用该过滤器之后在每列中的所有值将在范围[0,1]

其他提示

这是正确的。只是想提醒有关“正常化”和“标准化”的区别。什么在问题中提到的“标准化”,而“正常化”假设高斯分布和平均标准化,并且每个属性的标准偏差。如果你在你的数据的异常,在标准化过滤器可能会伤害你的数据分发最小,或最大可能比其他情况要远得多。

下面是与K均值在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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top