6

我有一个包含 14 个数字列的 ARFF 文件。我想分别对每一列执行标准化,即将每一列的值修改为(actual_value - min(this_column)) / (max(this_column) - min(this_column))。因此,列中的所有值都将在范围内[0, 1]。一列的最小值和最大值可能与另一列的不同。

如何使用 Weka 过滤器做到这一点?

谢谢

4

4 回答 4

8

这可以使用

weka.filters.unsupervised.attribute.Normalize

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

于 2010-02-18T15:24:02.893 回答
1

这是正确的。只是想提醒一下“规范化”和“标准化”的区别。问题中提到的是“标准化”,而“标准化”假设高斯分布并通过均值和每个属性的标准变化进行标准化。如果您的数据中有异常值,则标准化过滤器可能会损害您的数据分布,因为最小值或最大值可能比其他实例远得多。

于 2011-07-05T18:07:19.767 回答
0

这是 JAVA 中使用 K-Means 的工作规范化示例。

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();
于 2017-09-19T04:47:03.267 回答
0

在这种情况下,我们可以使用weka.filters.unsupervised.attribute.Normalize过滤器来规范化,但如果我们只想规范化某些列,以下将是最好的方法。

对选定列应用规范化

unsupervised.attribute.PartitionedMultiFilter可用于此任务。
因此,您必须根据需要配置过滤器范围部分。
例如:如果我只想对湿度属性进行归一化

步骤 01:
添加 ParririonedMultiFilter 后 -> 点击过滤器文本框 -> 选择 Normalize from weka.filters.unsupervised.attribute.Normalize-> 并根据需要编辑 Normalize 过滤器(通过提供比例和平移值)

在此处输入图像描述

步骤02:
点击范围文本框->删除默认过滤器(从前到后)->然后添加要过滤的列号->单击确定->单击应用 现在过滤器将仅添加到选定(湿度)列。
在此处输入图像描述

于 2021-06-12T07:47:20.520 回答